perm filename EXEC.MAC[10X,MRC]4 blob sn#398910 filedate 1978-11-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00378 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00025 00002	TITLE EXEC
C00028 00003	TAB LF FORMF CR EOL ALTM FDBCTL FDBTMP FDBNEX FDBDEL FDBNXF FDBUND FDBEPH FDBPRT FDBBYV FDBSIZ FDBCRV FDBWRT FDBRED FDBUSW DDTORG DDTSYM MAXJFN
C00031 00004	CBT CHR TRM KWV KWV1 BFP .BFP CNT
C00034 00005	ERROR $ERROR .ERROR TYPE $TYPE ETYPE NOISE CONFIRM ALTYPE TRAP INHELP
C00036 00006	BTCHER INTOFF INTON
C00037 00007	..T PDL CBUFL CSBUFL JBUFL EDFILL NTTYMD SGTBLN
C00039 00008	ALPHAN OCTDIG PUNBIT TEOL TSPC TALT TCOM TLPR TRPR TCOL TLAN TRAN
C00040 00009	COMOK EOLOK LPROK NSPALT WHLUO OPRUO ERRUO WOEPUO LANOK INVIS
C00043 00010	ONEWD NOCONF CONMAN ALTCON NOLOG PROGX EASUB CONFRC
C00046 00011	PUNCF STCF CTRLVF BAKFF DASHF NECHOF RUNF CTLCF1 CTLCF2 LOGOFF DTACHF NEOLF EOLNEF GROUPF F3 F2 F1
C00049 00012	B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16 B17 NSBUF BUF1 BUF2
C00051 00013	Z A B C D E F G AA BB CC DD EE FF GG P CALL RET
C00052 00014	.P .JBUFP JBUFP JBUF INIFH1 INIFH2 EOFDSP ILIDSP ERRMF
C00054 00015	CINITF STRTAC AUTFLG APJFN DTSF PRVENF PROPSF MESMSF MSGTIM LOCAL DOT CUSRNO FORK LRFORK IDFORK DBFORK UFORK DDTFLG NPAGE EFORK XFORK STRTIM TTYACF ALOFH PTTYMD ETTYMD SUPSUB CTLIM0 CTLIM1
C00058 00016	PRIMRY CIJFN COJFN CRJFNI CRJFNO CREDIF CREDOF CERET CTUUO CSTRR FRSTFR %EDAYT CSBUFP ERCOD ERPC DWNMSF
C00061 00017	DOWNTM UPTIME WHYHLT FRAME IUSRNM EDFILE DEVICE DIRNO OLDDIR OUTDSG INDSG LPNAME LPEXT LPFDB LFPOS GHEAD HEAD HEDLNO SPCG WIDTH LENGTH L35 L50 PAGENO PAGEN1 BESPTR BESCOR BESLNO PPRINT LEV1PC LEV2PC LEV3PC
C00065 00018	PD CBUF CBUFE CWBUF CJFNBK CSBUF CSBUFE PPATS SGTNAM SGTAC1 SGTAC2 PAGEN
C00068 00019	EXEC ..JBSYM ..JBUSY VERTXT VERSN PATVER PATS CUUOT CUUO
C00071 00020	.VERSI VERSI1 VERSI2 CMD2A3
C00073 00021	AUTOST AUTO0 REE
C00074 00022	EXEC0 EXEC0A EXEC06
C00078 00023	EXEC0B
C00080 00024	EXEC0C
C00082 00025	CMDIN1 CMDIN2 ERRET
C00085 00026	CMDN2B CMDN2C
C00087 00027	CMDN2D
C00089 00028	CMDIN4
C00091 00029	CMDN5B
C00093 00030	CMDN5D
C00095 00031	CMDN5E CMDN6 CMDN6A CMDN6B CMDN6C CMDN6D CMDN6E CMDN6J
C00099 00032	CMDN6K
C00100 00033	CMDN7 CIN0A
C00103 00034	CIN1A CIN1C
C00106 00035	CIN2 CIN2B
C00108 00036	CIN3 CIN3C CIN3B CIN3A
C00110 00037	CIN4 CIN4A CIN40 CIN41 CIN42 CIN43 CIN44 CIN45
C00114 00038	CIN5
C00115 00039	CIN6
C00117 00040	CSLSH
C00119 00041	CBKSL CBKSL1 CBKSL5
C00121 00042	ALOTST ALOFRK ALF1 ALF2 ALF3
C00123 00043	READ ONLY STORAGE AREA
C00125 00044	CTBL1
C00136 00045	CTBL2
C00139 00046	CHRTBL
C00143 00047	LEVTAB CHNTAB
C00145 00048	SPECIFIC EXEC COMMAND ROUTINES
C00147 00049	.STATU .JOBST JOBST0
C00149 00050	FSTR1 FSTR2 FSTRUC
C00152 00051	.RUNST RUNST8 LAPRNT
C00154 00052	FSTAT FSTAT4 FSTAT8 FSTAT9
C00156 00053	.PISTA Job TIW
C00158 00054	.IMPST IMPST0 IMPST1 IMPST2 IMPST3 IMPST4 IMPS45 IMPST5 IMPST6 IMPSTX
C00163 00055	.USEST
C00164 00056	.DSKST .DISCU DSKCNT DSKST1 DSKST2 DSKST3 DSKST5 DSKST4 CHKDAL
C00168 00057	.MEMST MEMS1 MEMS2 MEMS3
C00170 00058	MMAP MMAP1 MMAP2 MMAP6 MMAP7
C00173 00059	MMAP10 MMAP11 MMAP13
C00176 00060	NPAGID PAGID PAGID8 PAGID9
C00179 00061	.FILST ASTTJ
C00181 00062	JSTAT ILIJFN
C00183 00063	JSTAT2 JSTAT3 JSTAT4 JSTAT5 JSTAT6 JSTAT7 JSTAT8 JSTAT9 JSTA10
C00185 00064	.SYSTA SYST1 SYST2 SYST3
C00188 00065	SYST4 SYST5 SYST5A SYST8 SYST8A SYST8Y SYST9 SYST8X SYST8W
C00192 00066	.STATI
C00194 00067	STAT3 STAT51 STAT5A STAT6A STAT6B STAT6C STAT6E STAT6F STAT6G STAT5C STAT5Y STAT5Z STAT6 STAT5N SNAMS
C00198 00068	.ERRST SYST11 SYST12
C00200 00069	READT MORET READT1
C00202 00070	.TRMST TRMST0 TRMST1 TRMST2 TRMST3 TRMST4 TRMST5 TRMST6 TRMS60 TRMS61 TRMS62 TRMS63 TRMS64 TRMST7 TRMST8 TRMST9 TRMS10 TRMS11 TRMS12 TRMS13 TRM131 TRM132 TRMS14 TRM141 TRM142 TRM143 TRM144 TRM145
C00208 00071	.FULLD .HALFD .FORMF .TABS TABS1 .SHOW .LOWER .RAISE CMOD .LLENG
C00212 00072	.TERMI $TERMI TRMTAB .VT06 .VTCR .HYTYP .DMN .DM .TI733 .T33 .T35 .T37 .LA30 .NVT .TTY3 .SCOPE SCOPE1 SCOPE2 .BENDI .BEEHI .INFOT .DATA1 .VTS .TI .TI1
C00218 00073	.LWIDTH
C00219 00074	.INDIC .INDI1 CCCOC CCCOCS
C00221 00075	.ACCES ACCES1 ACCES2 ACCE21 ACCES3 ACCES4 ACCE.T $ACCS1 $ACCS2
C00225 00076	.ACCOU ACCOU0 ACCOU1 ACCOU2 ACCOU3
C00227 00077	.ADVIS
C00228 00078	.ASSIG
C00231 00079	ASSIG3 ASSIG5
C00233 00080	.ATTAC
C00235 00081	ATAC4B
C00237 00082	ATTAC5 ATA5A ATA5B ATA5C
C00239 00083	ATTAC7
C00241 00084	.AVAIL $AVAIL ..TERM TERMI1 TERMI9 EOLRET .PTYS .PTY1 .PTY2 .PTY3 .NVTS TERMY1 TERMY9
C00245 00085	.DEVIC BEFORE
C00247 00086	DEVLUP DEVL1 SIXPRT SIXPR1
C00249 00087	.BREAK BREAK1 BREAK3
C00250 00088	.CHANG $CHANG C.PSWD C.PSW0 C.PSW1 C.PSWT
C00255 00089	.CLEAR
C00256 00090	.CLOSE .COMMA .CONNE CONNE4
C00258 00091	$CONTI .CONTI ..CONT
C00260 00092	.DAYTI .DAYT1 .DAYT3 .DAYT5 .DAYT2 .DAYT4
C00263 00093	.DELET DELET0 DELET2 DELET3 DELET1
C00265 00094	.DDT DDT1 DDT2
C00268 00095	DDT3 DDT4
C00270 00096	.DEASS .DUMP
C00272 00097	.EDIT EDIT1 EDIT2 EDIT3 EDIT4 EDIT5 EDIT6 EDIT7 EDIT8
C00277 00098	.ENTRY ENTRY5
C00278 00099	.NOTEP .EPHEM
C00279 00100	.EXEC EXEC1 .NEXEC
C00280 00101	.EXPUN $EXPUN ..EXAL ..EXDL ..EXPE ..EXSC ..EXTM ..EXPU
C00282 00102	.FORK FORK1 FORK2
C00284 00103	.MERGE $MERGE $GET1 $GET11
C00286 00104	.ERUN ERUN0
C00287 00105	.RUN .GET GET1
C00289 00106	$GET2 GET2B GETILI
C00291 00107	ECFORK
C00293 00108	SUBNAM SUBN4 SUBN4A SUBN5
C00295 00109	.GOTO GOTO2
C00297 00110	.BDDT BDDT1 BDDT5 .NOBD
C00299 00111	.IDDT IDDT1 IDDT5 .NOID
C00301 00112	CDBGFK
C00303 00113	LDRUND LDRUN2 LDRUN3 LDRUN4
C00305 00114	USPLIC RSPLIC RSPLI5
C00307 00115	.INTER .FINGE .SINK
C00309 00116	.JFNCL
C00310 00117	.LIMIT $LIMIT .CORE .CPU .DISK .KILOC
C00312 00118	.LINK
C00313 00119	.LOGIN LOGIN0 LOGIN1
C00317 00120	LOGIN6 LOGI61 LOGIN7 LOGIN8
C00320 00121	SPECEOL USERN USERN2 LGNCHK TYPE <
C00323 00122	ACCT ACCT0 ACCT1 ACCT2 ACCTX PIE.P PIEPX
C00326 00123	DEFACT DEFA15 DEFAC2 DEFAC3
C00328 00124	PASWD
C00330 00125	PASWD1 PASWD3
C00333 00126	PSWDCK PSWDC4 PSWDCX
C00335 00127	MESMES MESMS9
C00337 00128	DWNTIM DWNTI5 DWNTI9
C00339 00129	TRYGTJ TRYG9
C00341 00130	MESS MESS2 MESS3 MESS4 MESS7 MESS8 MESS9
C00344 00131	.KKJOB .LOGOU LOGOU1 LOGO14 LOGOU2 LOGOU3
C00347 00132	JOBCNT JOBCN1 JOBCN2 JOBCN8 JOBC84 JOBCN9 JOBCNX
C00349 00133	.MAIL $MAIL M..CHK M..WAT $M.WAT M.WA.F M.WA.N
C00351 00134	CHKMSG CHKMS4 CHKMS9
C00353 00135	.MOUNT
C00354 00136	.NO $NO
C00355 00137	.NOT $NOT
C00356 00138	.NUMBE
C00357 00139	.NOTPE .PERPE PERPE0
C00359 00140	.PRNTR $PRNTR P..CHK P..WAT $P.WAT P.WA.F P.WA.N DEFDIR DEFDI1
C00361 00141	CHKPRN CHKPR1 CHKPRX
C00362 00142	.QUIT QUIT1 QUIT2
C00364 00143	INFER INFER0 INFER1 INFER3 INFRS INFER6 INFER9
C00366 00144	.PROTE
C00368 00145	.RECEI $RECTB ..ADVZ ..LINK
C00370 00146	$REENT .REENT ..REEN
C00372 00147	.REFUS
C00373 00148	.RENAM
C00375 00149	.RESET RESET RESET2 RESE25 RESET3 RESE30 RESE31 RESE32 RESET4
C00378 00150	.SAVE SAVE1
C00381 00151	SAVNOI SAVNO1
C00383 00152	.SHUT
C00384 00153	.SSAVE SSAV1
C00386 00154	.STOPS STOPS1
C00388 00155	$START .START ..STRT START1 START2
C00391 00156	WAIT WAIT2
C00394 00157	INVOLT WHY IFORK CHKPAT
C00400 00158	.UNDEL UNDEL1 UNDEL8
C00402 00159	.UNMOU
C00403 00160	.UNLOA .REWIN
C00405 00161	.WHERE WHERE1 WHERE2 WHERE4 WHERE5 WHER51 WHER52 WHER58 WHERE6 WHERE7 WHERE8 WHERE9 LITC3
C00411 00162	PDP-10 TENEX EXECUTIVE  ** X2CMD.MAC **
C00414 00163	.TTYPE .PRINT TTPRNT .APPEN .COPY COP1A COPFL
C00418 00164	COP2A
C00420 00165	COP3
C00423 00166	COPDF1 COPDEF
C00424 00167	COPDF3 COPDF4 COPDF5 COPDF6 COP4
C00427 00168	COP5A COP5B
C00431 00169	COP6C COP6Z
C00433 00170	COP7A
C00436 00171	COPTTY COPTT1 CTTEOF
C00438 00172	COPBY COPB1 CBYEOF CBYEF1 CBYEF2
C00441 00173	CPGBYT CPGBY2 CPGBY3 CPGBY4 CPBEOF
C00444 00174	CBYTPG CBYPG2 CBPGEF CBPEF3
C00446 00175	PAGES PAGES3 PAGES4
C00448 00176	PAGES5 PAGE5A PAGES6
C00450 00177	PAGES9 COPEOF
C00452 00178	$FNUFP $FFUFP
C00453 00179	$COPY .ASCII ASCII1 $ASCII .BINAR .BYTE .IMAGE $IMAGE .RECOR
C00455 00180	$OPEN7 $OPENF $OPNER
C00458 00181	LIST/TYPE <FILE GROUP DESCRIPTOR>
C00460 00182	LIST/TYPE...   STORAGE
C00463 00183	.TYPE .LIST LIST1 LIST01
C00464 00184	LIST1D
C00466 00185	$LIST ..DETA ..DOUB
C00467 00186	.HEADI HEADI1
C00469 00187	..INDI ..LENG ...LOG ...NO ..OUTP
C00470 00188	.PAGES PAGE1 PAGE2
C00472 00189	.PAUSE .SPACI SPAC2 ..SITE ...VRB .WIDTH
C00474 00190	LSTFL
C00475 00191	LSTH1B
C00477 00192	LSTH2 LSTH2A LSTH2D
C00480 00193	LSTH4 LSTH8 LSTIGE LSTGCK LSTGCE
C00484 00194	LSKIP
C00486 00195	LSTTOP LSP2A LSTP2B LSTP2C
C00488 00196	LSTCL LSTCL1 LSTCL2
C00491 00197	LSTC3A LSTC3B LSTC3C
C00494 00198	LSTC3D LSTC3X
C00495 00199	LSPNFF LSPFF LSPFF1 LSTP1 LSTP15
C00497 00200	LSTP19 LSTP2
C00499 00201	LIST8 LIST9 LIST91
C00501 00202	GGETC GETC
C00504 00203	GETC4 GETC4A GETC7 GETC8
C00506 00204	GETC10 GETC11
C00508 00205	GETC20 LSTEOF LSTE1
C00511 00206	COMCHR COMCH1 COMCH2 COMCHX STRCOM STRCO1 STRCO2 EXTTAB
C00514 00207	SITEO SITEX LITC4A
C00515 00208	.DETAC .REDIR RED2
C00518 00209	RED3 RED4
C00520 00210	REDIRECT/DETACH...
C00521 00211	REDI0 REDI1 REDI2 REDI3 REDI4
C00523 00212	REDO0 REDO1 REDO2 REDO3 REDO4
C00525 00213	$REDIR ..DTCH
C00527 00214	PDP-10 TENEX EXECUTIVE  ** X3CMD.MAC **
C00530 00215	.ARCHI $ARCHI ARC.FL ARCH3 ARCH1 ARCH2
C00534 00216	ARC.DL ARC.UN ARC.EX ARC.RS ARC.ST
C00536 00217	ARCSTR $ARC ..ARDF ..ARDL
C00538 00218	..ARDN $DONT ...DAR ...DDL STATER
C00540 00219	.QFD .QD .QW .QR
C00542 00220	.DIREC DIR0
C00545 00221	DIRFL DDIR
C00548 00222	UNMDIR
C00549 00223	$DIR
C00551 00224	.ALPHA .AUTHO .CHRON $CHRON
C00552 00225	.CRAM .DATES DATES1 .TIMES $DATE ..DELE .DOUBL .EVERY .LENGT
C00554 00226	.LPT $LPT $GTJFN LPT5 .OUTPU ..NO ..PROT .REVER .SEPAR ..SIZE ..TEN5 .VERBO
C00556 00227	DHEAD DHEADX DHEADZ
C00559 00228	DINDNT DHSOUT
C00561 00229	DNAME DNAME4 DNAME5 DNAME6 DNAME8 DNAMEX
C00564 00230	$GTFDB FDBILI
C00566 00231	DSKDIR
C00568 00232	DSKD2
C00570 00233	DSKR1
C00572 00234	DSKR2
C00574 00235	DSKR4 DTADRN DTADRE DTADR1 DTADR9
C00577 00236	DSKR5 DSKR7 DSKR8 DSKR9
C00579 00237	DSKS1 GRATR LESS HERE
C00583 00238	FDBSC
C00585 00239	FDBSC2 FDBSC3 FDBGR FDBEQ FDBLS
C00587 00240	FDBST1 FDBSTC
C00588 00241	DSKP DSKP1 DSKP4 DSKP5
C00590 00242	DFILE
C00592 00243	DFILE DFL02B
C00595 00244	DFL03A DFL03B DFL05 DFL05A
C00597 00245	DFREST DFR06A
C00599 00246	DFR07 DFR08 DFR85
C00601 00247	DFR09 DFR09A DFR09C DFR09D
C00604 00248	DFR10 DFR11 DFR12 DFR129 DFR13 DFRXIT
C00607 00249	DTADAT
C00608 00250	DCMPR DCMPR1 DCMPR9
C00609 00251	DFDBCM DFDC10
C00612 00252	DFNOUT DFILL DFILL9
C00614 00253	OLDTAD OLDTA2
C00616 00254	OLDTA4
C00618 00255	OLDTA7 OLDTA9 LITC5
C00619 00256	..PRIN
C00622 00257	DIRPNT PR1 PR2
C00624 00258	DIRPNT...
C00626 00259	DIRP11 F3NOT
C00628 00260	$PRINT ..VERB
C00629 00261	SUPER SUPER1 SUPPW
C00630 00262	.CREAT
C00632 00263	CRET1A
C00634 00264	CREAT3 CREAT8 CREAT9 CRET9A
C00636 00265	CRSUB
C00637 00266	$CREAT ....NO $$$$NO .MAILB
C00639 00267	..NOT .NAME .PASSW
C00641 00268	..DISK .NETWI .MAINT .WHEEL .OPERA .CONFI CPRIV .FILES .REPEA CCMODE
C00643 00269	.PRIVI .MODE .SPECI CSPEC ...NUM NUMBE1
C00645 00270	...PRO .DEFAU $DEFAU ....PR ..NUMB
C00647 00271	.RETEN .USER ..DIRE BITIN
C00649 00272	.KILL .ABORT ..LIST $.LIST
C00651 00273	.CYCLE ...DSK $$$DSK
C00653 00274	.EDDT EDDT3 EDDT4 EDDT5
C00655 00275	.DISAB DISAB1 .ENABL ..LOGO
C00657 00276	.HALT HALT0 HALT2 HALT3 HALT4 HALT7 $HALT ..HLTA ..HLTD $HLTDU ..HLTF ..HLTI ..HLTR ..HLTU
C00663 00277	TIMPMN TIMPSC
C00664 00278	.INITI $INITI
C00665 00279	.KFACT .LOAD .NETWO $NETWO
C00666 00280	.OFFLI .ONLIN .ONLI1
C00668 00281	..PAUS .PERMI .PROCE .PROHI
C00669 00282	.SYSTE $SYSTE
C00670 00283	.SET INDT CHKDAT CHKDA4 CHKDA8 CHKDA9
C00673 00284	.TRAPS $TRAPS ..UNLO
C00674 00285	.NETLO NETLO0 NETLO2
C00677 00286	NETLO4 NETL41 NETL42 NETL43 NETL44 NETLO5 NETL55 NETL56 NETL57 NETLO6 NETL69 NETLO9 NETLOX
C00681 00287	READY READY4 READY2 READY3
C00683 00288	%KEYW
C00687 00289	%KEYW CWRD2 CWRD3 CWRD3A
C00690 00290	CWRD4 CWRD5 CWRD6
C00693 00291	CWRD8
C00695 00292	PRVCK PRVCK8
C00697 00293	FSYM - SYMBOL TABLE LOOKUP SUBROUTINE USED IN %KEYW (PRECEDING)
C00699 00294	FSYM
C00700 00295	FSRC1 FSRC1A FSRC2 UPAR APAR NOMAT FSRC3 FSRC4
C00703 00296	NEM1 NEM2
C00705 00297	SBST SBST1
C00708 00298	%NOI
C00711 00299	NOIA NOI0 NOI0A
C00713 00300	NOI1 IGNOI2 IGNOI1 IGNOI3
C00716 00301	%SBCOM SBCOM1 SBCOM9
C00719 00302	%INHEL UINHE9
C00721 00303	CSTR AND MORE
C00724 00304	CSTR CSTR0 CSTR1 CSTR2 CSTR3 CSTR5
C00727 00305	CSTR9
C00729 00306	PASCOM PASCM1 %ALLOW
C00731 00307	CONF CONF2
C00735 00308	CONF6 CONF7 CONF8 CONF9 CONFE CONFE1
C00738 00309	TCONF TCONF1 TCONFC TCONFX TCONFR
C00741 00310	SPRTR
C00744 00311	CCHRI CCHR1 CCHR8
C00747 00312	$CTRLH $CTRLA CTRLA1 CTRLA2 CTRLA3 $CTRLW CTRLW1 CTRLW2 $CTRLR $CTRLX $RUB
C00751 00313	$FORMF FORMF1 $EOL $DASH $CTRLV $CONT
C00753 00314	UBP CCHEOF CCHEF1 CCHEF2 CCHEF3 CCHEF4
C00755 00315	%TYPE TYP1 TYP2 CTYPE %$TYPE $CTYPE %ALTYP
C00757 00316	COLLECT FILE NAMES:
C00761 00317	COLLECT FILE NAMES COMMENTS...
C00763 00318	COUTFN CINFN CEDFN
C00765 00319	.INFG .INFG1 INFG $INFG DIRARG
C00768 00320	SPECFN CFN1 CFN1A CFN1B
C00771 00321	CFN2
C00773 00322	CFN3 CFN3A CFN3B
C00777 00323	CFN4 CFN4X CFN4Y CFN4Z
C00781 00324	CFN7A CFN7B
C00783 00325	CFN7C CFN7D CFN7Z
C00785 00326	CFN8 CFN9 CFN9A
C00786 00327	CFNE
C00789 00328	INTRM
C00790 00329	LFJFNS LFJF9
C00792 00330	CPFN
C00793 00331	TYPIF GNFIL GNFIL3 GNFIL5 GNFIL8
C00795 00332	FRSTF FRSTF1 NEXTF
C00797 00333	DEVN DEVN1 DEVNE
C00800 00334	DIRNAM DIRNAX
C00802 00335	TTYNUM TTYN1 TTYN2 TTYN3 TTYN4 TTYN5 TTYN6 TTYN7 TTYN8 TTYN9 TTYN10 TTYN11
C00806 00336	DATEIN
C00809 00337	DECIN BIGOCT BIGOC1 INCON1 OCTAL2 OCTAL3 OCTAL7 OCTAL
C00812 00338	OCTCOM OCCOM3 OCCOM5 OCCOM8
C00814 00339	TOCT
C00815 00340	BUFFS BUFFF BUFF0 BUFFF1 BUFFF2 BUFFF3
C00817 00341	ALLBK NALNBK BRKST1 NOECHO DOECHO ECHOST
C00819 00342	NOECEO NOECE1 DOECEO
C00820 00343	LTTYMD LTTYM8 LTTYM9
C00822 00344	RTTYMD RTTYM9
C00823 00345	INETTY INPTTY
C00825 00346	%PRINT PRIN1 CCHRO COUTC
C00827 00347	MAPPF MPPF1 MPPF8 MAPACS LOADF STOREF
C00830 00348	%GTB
C00831 00349	HUPSI HUPSI9 HUPSI8 HUPSI7
C00834 00350	USEPSI USEPS4 USEPS5 USEPS6 DING
C00837 00351	CERR NIM NIYE SCREWUP JERR JERR1 JERRC
C00839 00352	%TRAP
C00842 00353	ILIPSI EOFPSI
C00845 00354	DATPSI
C00846 00355	CCPSI
C00848 00356	CCDB2 CCDB3 CCDB4 CCERET
C00850 00357	ALOPSI ALOPS1 AUTOLO AUTOL6
C00852 00358	%ERR %.$ERR SYSERA SYSERM ERR1 ERR5 ERR04 ERR5A ERR6
C00856 00359	ERR7 ERR7F ERR8 RERET
C00858 00360	ERFRST ERFRS1 ERFRS2 ERFRS3
C00861 00361	CRIF $GETER
C00862 00362	RLJFNS RJFNS1 RJFNS8
C00864 00363	%ETYPE ETYP2 ETYP2A
C00866 00364	ETYP4 ETYP5 END%
C00868 00365	%LETS UN%
C00870 00366	%A A1 A2 %B %B1 %C %D %E
C00872 00367	%F %H
C00874 00368	%I %I1 %I3 %K
C00876 00369	%L %M %G %N
C00878 00370	%O %P %J %Q %Q2 %Q1 FLOAT
C00881 00371	%R %S %T
C00882 00372	%U %U1 %U2 %U3 %V
C00884 00373	%X %X1 %X3 %X9
C00887 00374	%Y %Z %Z1 %Z2
C00888 00375	TOUT
C00889 00376	UNMAP
C00890 00377	$SYSGT SYSGT1 SYSGT2 SYSGT3 SYSGT4
C00892 00378	FPIN
C00894 ENDMK
C⊗;
TITLE EXEC

SUBTTL PDP-10 TENEX EXECUTIVE SYMBOL DEFINITIONS

SEARCH STENEX
.DIREC .XTABM

;***** DEFAULT CONDITIONALS ********
IFNDEF DST10X,<DST10X==0>	;TURNOFF DISTRIBUTED CODE UNLESS
				;REQUESTED BY A PARAMETER FILE


;**** THINGS THAT AFFECT THE LANGUAGE EFFECTED BY THIS CODE *****



CTRLC==3	;SUPER-PANIC PSI CHARACTER
		;AND "TERMINAL CODE" FOR SAME
CTCODE==↑D20	;"TERMINAL CODE" FOR CHARACTER ASSIGNED TO PSI THAT
		;PRINT RUNTIME (↑T)
HUCODE==↑D30	;"TERMINAL CODE" FOR DATAPHONE CARRIER OFF (HANGUP)
BELL==7         ;CHARACTER TO RING WHEN ILLEGAL ↑A OR ↑W INPUT,
                ;OR WHEN RECOGNITION AMBIGUITY REQUIRES MORE INPUT
CTRLE==5	;CHARACTER THAT PREFIXES PRIVILEGED COMMANDS
CTRLZ==32	;EOF CHARACTER FOR "COPY" COMMAND WHEN TTY IS SOURCE
CONTCH==176	;STORED INTERNALLY FOR CONTINUATION CHARACTER (&).
		;ONE BYTE, TRANSLATED BACK TO EOL-SPACE-& ON OUTPUT
		;FOR ↑R, ↑A. THIS CHAR MUST NEVER TURN UP OTHERWISE;
		;IS 176 THE BEST VALUE?

;ALSO MANY CHARACTERS ARE GIVEN SPECIAL FUNCTIONS BY THEIR ENTRIES
;  IN THE CHARACTER TABLE (CHRTBL) IN RS.MAC.

;AUTOMATIC LOGOUT PARAMETERS:
;AUTOLOGOUT OCCURS IN TOP-LEVEL EXEC WHEN JOB IS NOT LOGGED IN AND:
;	1) EXEC RETURNS TO COMMAND INPUT AND AT LEAST AUTOLO1 SECONDS
;	   HAVE ELAPSED SINCE EXEC WAS STARTED, OR
;	2) AUTOL2 SECONDS HAVE ELAPSED SINCE STARTUP AND THERE HAS
;	   BEEN NO TELETYPE ACTIVITY FOR AUTOL3 SECONDS.
AUTOL1==↑D120
AUTOL2==↑D60
AUTOL3==↑D30

;CONTROL T PARAMTERS
CTTIM0==↑D15	;MAX. ↑T INTERVAL THAT CAUSES FULL TYPEOUT
CTTIM1==1	;MIN. INTERVAL BETWEEN TYPEOUTS (CAN BE 0)
;TAB LF FORMF CR EOL ALTM FDBCTL FDBTMP FDBNEX FDBDEL FDBNXF FDBUND FDBEPH FDBPRT FDBBYV FDBSIZ FDBCRV FDBWRT FDBRED FDBUSW DDTORG DDTSYM MAXJFN

;****************** SYSTEM DEPENDENT THINGS ********************


; ASCII CHARACTERS - IF ANY ARE CHANGED, MUST ALSO CHANGE "CHRTBL"!
TAB==11		;TAB (↑I ON MODEL 33 TTY)
LF==12		;LINE FEED
FORMF==14	;FORM FEED
CR==15		;CARRIAGE RETURN
EOL==37         ;CHARACTER FOR END OF LINE (CR-LF)
ALTM==33        ;ALT MODE, ESC, ETC KEY

; FILE DESCRIPTOR BLOCK IN FILE DIRECTORY
FDBCTL==1	;CONTROL BITS WORD
FDBTMP==1B0	;TEMPORARY FILE CONTROL BIT
FDBNEX==B2	;FILE DOESN'T EXIST (NO EXTS) CONTROL BIT
FDBDEL==1B3	;FILE DELETED BIT IN CONTROL BITS WORD
FDBNXF==B4	;FILE DOESN'T EXIST (WRITE INCOMPLETE) CONTROL BIT
FDBUND==1B9	;FILE IS NOT DELETABLE (PERPETUAL, IMMORTAL,...!)
FDBEPH==1B17	;FILE IS AN EPHEMERON
FDBPRT==4	;PROTECTION WORD
FDBBYV==11	;# VERSIONS TO RETAIN, BYTE SIZE, # PAGES
FDBSIZ==12	;BYTE COUNT THAT WOULD ADDRESS EOF
FDBCRV==13	;VERSION CREATE DATE & TIME
FDBWRT==14	;DATE AND TIME OF LAST WRITE
FDBRED==15	;READ DATE & TIME
FDBUSW==24	;USER SETTABLE WORD

;WHERE DDT (UDDT.SAV) RESIDES
DDTORG==770000
DDTSYM==DDTORG+1	;LOCATION IN DDT THAT POINTS TO LOC WHERE
			;SYMBOL TABLE POINTER IS STORED ($I-1)


MAXJFN==155		;FOR FILSTAT, RLJFNS, ETC
;CBT CHR TRM KWV KWV1 BFP .BFP CNT

;*********** DEFINITIONS THAT ARE INTERNAL TO EXEC ***********


;MNEMONIC AC'S
CBT=7		;DESCRIPTIVE BITS FROM "CHRTBL" FOR LAST CHARACTER
CHR=10          ;INPUT CHARACTER
TRM=11          ;LAST INPUT FIELD TERMINATOR
KWV=12          ;VALUE WORD RETURNED BY LAST KEYWORD TABLE LOOKUP
KWV1=13         ;KWV SAVED AFTER FIRST KEYWORD IN COMMAND
BFP=14          ;COMMAND BUFFER POINTER
.BFP=15         ;DITTO SAVED AT BEGINNING OF LAST FIELD
CNT=16          ;NUMBER OF CHARACTERS IN FIELD (REQUIRED BY 
                ;EDITING STUFF)


;UUO'S USED IN EXEC. MOST HAVE CALLING MACROS.
;NOTE: UUO DISPATCH TABLE AND DISPATCHER ARE AT BEGINNING OF XMAIN.MAC.
;      UUO ROUTINES ARE IN XSUBRS.MAC.
        OPDEF UERR[1B8]		;ERROR MESSAGE
        OPDEF UTYPE[2B8]	;TYPE MESSAGE
	OPDEF KEYWD[3B8]	;KEYWORD INPUT AND LOOKUP
        OPDEF UNOI[4B8]		;NOISE WORD INPUT/OUTPUT
	OPDEF U$TYPE[5B8]	;TYPE AND STORE MESSAGE
	OPDEF ALLOW[6B8]	;CHECK LAST CHARACTER'S DESCRIPTIVE BITS
	OPDEF UALTYP[7B8]	;TYPE AND STORE MESSAGE IF
				; AC "TRM" CONTAINS ALT MODE
	OPDEF U$ERR[10B8]	;ERROR MESSAGE WITHOUT CR FIRST
	OPDEF UETYPE[11B8]	;TYPE MESSAGE AND INTERPRET % CODES
	OPDEF GTB[12B8]		;CONVENIENT INTERFACE TO THE GETAB JSYS
	OPDEF PRINT[13B8]	;PRINT ASCII CHARACTER FROM EFF ADDR
	OPDEF UTRAP[14B8]	;ERROR PSI MESSAGE
	OPDEF U.$ERR[15B8]	;ERROR THAT DOESN'T CLEAR BUFFERS (↑X)
	OPDEF UINHEL[16B8]	;INPUT A FIELD AND GIVE HELP ON "?"
	OPDEF SUBCOM[17B8]	;INPUT AND DISPATCH ON SUBCOMMANDS
;ERROR $ERROR .ERROR TYPE $TYPE ETYPE NOISE CONFIRM ALTYPE TRAP INHELP

;MACROS TO CALL UUO'S AND SUBROUTINES

        DEFINE ERROR (TEXT)
<       UERR [ASCIZ @TEXT@]
>
	DEFINE $ERROR (TEXT)
<	U$ERR [ASCIZ @TEXT@]
>
	DEFINE .$ERROR (TEXT)
<	U.$ERR [ASCIZ @TEXT@]
>
        DEFINE TYPE (TEXT)
<       UTYPE [ASCIZ @TEXT@]
>
	DEFINE $TYPE (TEXT)
<	U$TYPE [ASCIZ @TEXT@]
>
	DEFINE ETYPE (TEXT)
<	UETYPE [ASCIZ @TEXT@]
>
        DEFINE NOISE (TEXT)
<	UNOI [ASCIZ @TEXT@]
>
        DEFINE CONFIRM
<       CALL CONF
>
	DEFINE ALTYPE (TEXT)
<	UALTYP [ASCIZ @TEXT@]
>
	DEFINE TRAP (TEXT)
<	UTRAP [ASCIZ @TEXT@]
>
	DEFINE INHELP (TEXT)
<	UINHEL [ASCIZ @TEXT@]
>
;BTCHER INTOFF INTON

; THE FOLLOWING SIMULATE UNIMPLEMENTED JSYS'S

	;HYPOTHETICAL FUTURE JSYS TO STOP NON-INTERACTIVE JOB
	DEFINE BTCHER
	<>


;TURN OFF INTERRUPTS
	DEFINE INTOFF <
	MOVEI 1,400000
	DIR>

;TURN ON INTERRUPTS
	DEFINE INTON<
	MOVEI 1,400000
	EIR>
;..T PDL CBUFL CSBUFL JBUFL EDFILL NTTYMD SGTBLN

;COMMAND TABLE MACROS

;AN ENTRY
;ALSO USED FOR DEFAULT INFORMATION AFTER "KEYWD" MACRO
        DEFINE T(TEXT,BITS,ADDR)
<	IFB <ADDR>,<..A=.'TEXT>
        IFNB <ADDR>,<..A=ADDR>
        [BITS+0,,..A],,[ASCIZ @TEXT@]
>

;HANDIER MACRO FOR USE WHERE "EOLOK" BIT IS TO BE SET
	DEFINE TE (TEXT,BITS,ADDR)
<	T <TEXT>,EOLOK!BITS,ADDR>

;A "FAKE" ENTRY TO FORCE AN AMBIGUITY
	DEFINE X (TEXT)
<	T <TEXT'!>,NOLOG+EOLOK+INVIS,CERR
>
;BEGIN TABLE.
;FIRST WORD MUST BE NUMBER OF ENTRIES
        DEFINE TABLE
<	Z		;FILLED IN BY NEXT TEND
	..T==.		;USED BY NEXT TEND
>
;END TABLE
        DEFINE TEND
<       ..U==.
        LOC ..T-1
	..U-..T	       ;FILL IN FIRST WORD OF TABLE
        LOC ..U
>




;AREA SIZES

PDL==120        ;PUSHDOWN
CBUFL==↑D50     ;COMMAND BUFFER LENGTH. DETERMINES LENGTH OF COMMAND.
CSBUFL==↑D40	;STRING BUFFER MINIMUM SIZE (ACTUAL DEPENDS ON
		;PAGE BOUNDARY).
		;BIG ENOUGH FOR USR NAME, PASSWD, ACCT #, AND THEN SOME
JBUFL==17	;JFN BUFFER LENGTH: ONE MORE THAN # JFNS IN A CMD.
EDFILL==17	;FILE NAME.EXT SAVED BY EDIT COMMAND
		;(FIRST WORD IS POINTERS)

NTTYMD==11	;NUMBER OF TTY, ETC. MODE WORDS

SGTBLN==↑D40	;SIZE OF THE $SYSGT HASH TABLE(S)
;ALPHAN OCTDIG PUNBIT TEOL TSPC TALT TCOM TLPR TRPR TCOL TLAN TRAN

;BITS BITS BITS


;CHARACTER DESCRIPTION BITS.
;USED IN ENTRIES IN CHARACTER TABLE (CHRTBL) AND THUS THEY APPEAR
; IN AC "CBT" AND IN CALLS TO "ALLOW" UUO.

		  ;BIT SET FOR ---
ALPHAN==1	;ALHPANUMERIC CHARACTERS AND "-"
OCTDIG==2	;OCTAL DIGITS 0 THRU 7
PUNBIT==4	;PUNCTUATION = MOST OTHER PRINTING CHARACTERS
TEOL==10	;EOL AND SEMICOLON
TSPC==20	;SPACE AND TAB
TALT==40	;ALT MODE
TCOM==100	;COMMA
TLPR==200	;LEFT PAREN
TRPR==400	;RIGHT PAREN
TCOL==1000	;COLON (FOR DEVICE NAMES)
TLAN==2000	;LEFT ANGLE BRACKET
TRAN==4000	;RIGHT ANGLE BRACKET (>)
;COMOK EOLOK LPROK NSPALT WHLUO OPRUO ERRUO WOEPUO LANOK INVIS

;BITS IN LEFT HALF OF VALUE WORD IN KEYWORD TABLES

;BITS DEFINED HERE ARE RETURNED IN LEFT HALF OF AC "KWV" BY THE LOOKUP
; UUO, "KEYWD".
;SOME OF THESE BITS ARE INTERPRETED BY %KEYW ITSELF, AND SOME ARE
; USED BY ITS CALLERS, AS FOLLOWS.

;THIS FIRST GROUP IS TESTED IN %KEYW, THE SERVICE ROUTINE FOR "KEYWD".
   ;BIT --	   ;MEANING IF BIT ON --
COMOK==1	;COMMA IS OK AS TERMINATOR FOR THIS WORD
EOLOK==2	;CARRIAGE RETURN OR SEMICOLON OK AS TERM FOR THIS WORD
		 ; ALSO, "EOLOK" IS IMPLIED BY "ONEWD"
LPROK==4	;LEFT PAREN OK TO TERMINATE THIS WORD
			;(USED WHERE A NOISE WORD CAN FOLLOW)
NSPALT==10	;DON'T TYPE SPACE AFTER A WORD TERMINATED WITH ALT MODE
;WHLUO, OPRUO, ERRUO REFER TO SPECIAL CAPABILITIES ENABLED:
WHLUO==20	;DON'T RECOGNIZE KEYWORD IF USER DOESN'T HAVE WHEEL PRIV
OPRUO==40	; " " " " " " " OPERATOR PRIVILEGE
ERRUO==100	; " " " " " " " CONFIDENTIAL INFORMATION ACCESS PRIV
WOEPUO==200	;DON'T RECOGNIZE KEYWORD IF USER HAS NEITHER WHEEL NOR
		;OPER NOR CONF INF ACCESS SPECIAL CAP POSSIBLE
		;(NEEDN'T BE ENABLED)
		;NOTE: IF MORE THAN ONE OF THE PRIVILEGE BITS ARE ON,
		;THE KEYWORD IS ACCEPTED IF USER HAS ANY OF THE PRIVS.
LANOK==400	;LEFT ANGLE BRACKET ACCEPTABLE AFTER THIS WORD
INVIS==1000	;DO NOT LIST THIS ENTRY'S KEYWORD WHEN "?" IS TYPED
		;(TESTED IN %Z IN ETYPE)
;ALL BITS NOW IN USE -- UG !-- 8/28/70
;ONEWD NOCONF CONMAN ALTCON NOLOG PROGX EASUB CONFRC

;BITS IN LH VALUE WORD IN KEYWORD TABLES...

;THE REST OF THE BITS ARE NOT TESTED BY %KEYW.
;THIS NEXT GROUP ARE USED IN THE MAIN COMMAND TABLES, AND ARE
; MOVED TO AC "KWV1" AFTER FIRST KEYWORD IS INPUT, AND
; STAY IN KWV1 THROUGHOUT COMMAND DECODING.
;SEVERAL ALSO USED IN SUBCOMMAND TABLES
;SUBROUTINE "CONF" LOOKS AT SEVERAL OF THESE.
ONEWD==400000	;ONE WORD COMMAND: CONFIRM BEFORE DISPATCH,
		 ; "EOLOK" BIT IMPLIED
NOCONF==200000	;THIS COMMAND REQUIRES NO CONFIRMATION
CONMAN==100000	;CONFIRMATION IS MANDATORY FOR THIS COMMAND
ALTCON==40000	;ALT MODE MAY BE USED TO CONFIRM THIS COMMAND
			;(EOL ECHOED)
NOLOG==20000	;THIS COMMAND LEGAL EVEN IF NOT LOGGED IN
PROGX==10000	;RUN A PROGRAM WHICH WILL APPEAR AS AN
		;  EXTENTION TO THE EXEC.  THIS BIT IS NEVER ON IN
		; COMMAND TABLE ENTRIES.  IT IS TURNED ON BY THE EXEC
		; WHEN IT DECIDES THAT A FILE NAME SHOULD LOOK LIKE
		; AN EXEC COMMAND.
		;ALSO B5 USED IN "CREATE" SUBCOMMAND TABLE
EASUB==4000	;THIS COMMAND EXAMINES, ALTERS, OR EXECUTES SUBSIDIARY
		 ; FORK, AND IS THUS ILLEGAL IF A PROPRIETARY
		 ; PROGRAM IS IN THAT FORK.
CONFRC==2000	;CONFIRMATION IS FORCED FOR THIS COMMAND

;THE FOLLOWING ARE SOME OF THE OTHER BITS USED IN VARIOUS OTHER TABLES.
;DO NOT REDEFINE THESE BITS OR THOSE IN GROUP INTERPRETED BY
; "%KEYW" IN SUCH A WAY AS TO PRODUCE A CONFLICT!
;B5 ALSO USED IN "CREATE" SUBCOMMAND TABLE (5/14/70).
;PUNCF STCF CTRLVF BAKFF DASHF NECHOF RUNF CTLCF1 CTLCF2 LOGOFF DTACHF NEOLF EOLNEF GROUPF F3 F2 F1

;FLAG BITS IN AC Z LEFT HALF
;THESE FLAGS ARE CLEARED BEFORE EACH COMMAND IS DECODED

PUNCF==1        ;PUNCTUATION OTHER THAN FILE NAME FIELD TERMINATORS
		; OK IN INPUT FIELDS.
		; TESTED IN "CSTR" SUBROUTINE.
STCF==2         ;STORE CHARACTERS WHICH ARE OUTPUT WITH SUBR "CCHRO"
                 ;(AND HENCE MACRO "TYPE") INTO CBUF (POINTER "CBP").
                 ;USED WHILE REST OF WORD IS BEING TYPED AFTER ALT MODE.
CTRLVF==4	;THIS CHARACTER WAS PRECEDED BY ↑V
		 ;SET IN "CCHRI", TESTED IN "CSTR"
BAKFF==10	;BACK UP A FIELD (UN-INPUT FIELD): CAUSES CSTR SUBR AND
		 ; KEYWD UUO TO RE-USE THE PREVIOUS INPUT FIELD.
DASHF==20	;"-" A TERMINATOR NOT "ALPHANUMERIC" CHARACTER
NECHOF==40	;ECHOING OFF (PASSWORD INPUT). TESTED IN %NOI.
RUNF==100	;PROG RUNNING (OR AT LEAST ITS TTY MODES IN EFFECT)
		;ALSO TELLS ↑C TO FREEZE THE WORLD (5/20/70).
CTLCF1==200	;SET BY ↑C TO SAY CLEAR BUFFER ON ANOTHER ↑C
CTLCF2==400	;SET BY 2ND ↑C TO SAY CLEAR BUFFER AFTER DEBREAK
LOGOFF==1000	;SET DURING LOGOUT MESSAGE AND LOGGING OUT PROCESS.
		;TELLS ERRORS AND ↑C TO SAY "NOT LOGGED OUT".
DTACHF==2000	;INDICATES "DETACH" COMMAND.
		;DISTINGUISHES IT FROM "REDIRECT" AND OTHER COMMANDS
		;DURING EXECUTION.
NEOLF==4000	;TELLS CSTR AND OTHER ROUTINES NOT TO ECHO INPUT EOL'S.
		;USED WHEN A FILE NAME IS BEING PRE-READ.
EOLNEF==10000	;SAYS AN EOL HAS BEEN INPUT BUT NOT ECHOED.
GROUPF==20000	;ON IF INFG ETC INPUT A GROUP OF INPUT FILE NAMES
		;(A NAME WITH AN *, OR MORE THAN ONE NAME)
F3==40000	;FLAG AVAILABLE FOR USE IN COMMANDS,
		;NOT CLOBBERED BY UUO'S OR SUBROUTINES.
F2==100000	;ANOTHER FLAG AVAILABLE FOR USE IN COMMANDS
F1==200000	;FLAG AVAILABLE FOR LOCAL USE IN SUBRS AND UUO'S


;FLAG BITS IN AC Z RIGHT HALF ARE ALSO AVAILABLE TO COMMAND ROUTINES.
;B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16 B17 NSBUF BUF1 BUF2

;GENERAL PURPOSE BIT SYMBOLS
;USED, FOR INSTANCE, IN JSYS CALLING SEQUENCES
B0==400000
B1==200000
B2==100000
B3==40000
B4==20000
B5==10000
B6==4000
B7==2000
B8==1000
B9==400
B10==200
B11==100
B12==40
B13==20
B14==10
B15==4
B16==2
B17==1



;LOCATIONS OF SOME PAGE BUFFERS

;PAGE-MAPPING BUFFERS ARE BETWEEN 747000 AND 767777.
NSBUF=747000	;WINDOW INTO NETWORK STATISTICS FILE
BUF1=750000	;"COPY" COMMAND SOURCE PAGE
;ALSO BUF1 AND FOLLOWING PAGES ARE USED BY "DIRECTORY"
BUF2=751000	;"COPY" COMMAND DESTINATION PAGE
;PAGEN==1000	;IS ASSEMBLED INTO XPRIV.MAC.
;Z A B C D E F G AA BB CC DD EE FF GG P CALL RET

;************* TENEX SYSTEM STANDARD DEFINITIONS *************

;AC'S
Z=0
A=1
B=2
C=3
D=4
E=5
F=6
G==7
AA==10
BB==11
CC==12
DD==13
EE==14
FF==15
GG==16
P=17    ;PUSHDOWN POINTER

	OPDEF CALL [PUSHJ P,]
	OPDEF RET [POPJ P,]
;.P .JBUFP JBUFP JBUF INIFH1 INIFH2 EOFDSP ILIDSP ERRMF

SUBTTL PDP-10 TENEX EXECUTIVE PRIVATE STORAGE AREA

	LOC 140

;STORAGE FOR EXEC COMMAND INTERPRETER

CSZ1==.    ;CSZ1 TO CSZ2 IS ZEROED EVERY COMMAND

.P:	Z	;P SAVED AT BEGINNING OF SUBCOMMAND, FOR %ERR TO RESTORE

.JBUFP:	Z	;JBUFP SAVED AT BEGINNING OF SUBCOMMAND
JBUFP:	Z	;PUSHDOWN-TYPE POINTER INTO...
JBUF:	BLOCK JBUFL   ;BUFFER (STACK) FOR JFN'S. JFN'S OF ALL FILES
		;MENTIONED IN A COMMAND MUST BE HERE SO ERROR ROUTINES
		;CAN CLOSE AND RELEASE THEM.
CJFN1==JBUF	;JFN OF FIRST ARGUMENT
CJFN2==JBUF+1	;JFN OF 2ND ARGUMENT
INIFH1:	Z	;JBUFP VALUE FOR FIRST JFN IN INPUT FILE GROUP
INIFH2:	Z	;SAME FOR LAST FILE.  SAME AS INIFH1 UNLESS SEVERAL
		;NAMES (SEPERATED BY COMMAS) WERE GIVEN.

EOFDSP:	Z	;SPECIAL DISPATCH ADDRESS FOR EOF PSI, EG DURING "COPY"

ILIDSP:	Z	;0 OR SPECIAL DISPATCH FOR ILLEG INSTRUCTION TRAP

ERRMF:	Z	;NON-ZERO WHILE PROCESSING ERROR
		;CURTAILS PROCESSING OF NESTED ERRORS TO AVOID
		;INFINITE LOOPS IN ERROR CODE.


CSZ2==.-1  ;END OF AREA ZEROED EVERY COMMAND
;CINITF STRTAC AUTFLG APJFN DTSF PRVENF PROPSF MESMSF MSGTIM LOCAL DOT CUSRNO FORK LRFORK IDFORK DBFORK UFORK DDTFLG NPAGE EFORK XFORK STRTIM TTYACF ALOFH PTTYMD ETTYMD SUPSUB CTLIM0 CTLIM1

CINITF:	Z	;NON-ZERO AFTER STARTUP INITIALIZATION COMPLETED
STRTAC:	REPEAT 20,<Z
>

AUTFLG:	Z	;JFN FOR AUTOSTARTUP JOBS, 0 OTHERWISE
APJFN:	Z	;PRIMARY IO FOR AUTOSTARTED FORK
DTSF:	Z	;NON-0 IF SYSTEM DATE & TIME HAVE BEEN SET

PRVENF:	Z	;NON-0 IF PRIVILEGED COMMANDS "ENABLE"D

PROPSF:	Z	;NON-0 IF INFERIOR IS A PROPRIETARY SUBSYSTEM.
		;DISABLES /, \, GOTO, SAVE, ETC.
		;NOTHING SETS THIS YET (6/9/70), SHD BE SET IN "GET"←←←←

MESMSF:	Z	;MESSAGE FLAG: NON-0 SAYS TO LOOP TO TYPE
		;"YOU HAVE A MESSAGE" IF APPROPRIATE

MSGTIM:	Z	;"TIME" DEADLINE OF NEXT MAIL CHECK, OR -1 IF
		;MAIL CHECK IS OFF.

LOCAL:	Z	;NON-ZERO IF THIS IS A LOCAL TERMINAL
TTCTY==20		;CTY LINE - ABOVE THIS ARE PTY'S

DOT:	Z	;"." FOR DDT-TYPE EXEC COMMANDS

CUSRNO:	Z	;USER # IF LOGGED IN, 0 IF NOT

FORK:	Z	;-1 OR HANDLE OF INFERIOR FORK EXEC CURRENTLY KNOWS OF.
		;SET BY GET, RUN, FORK N, ETC.
		;USED BY START, /, \, GOTO, ETC.

LRFORK:	Z	;-1 OR HANDLE OF FORK LAST RUN.
		;SET BY START, REENTER, GOTO, RUN, SUBSYS CALL.
		;USED BY CONTINUE.

IDFORK:	Z	;-1 OR FORK HANDLE OF IDDT
;;; BDFORK:	Z	;-1 OR FORK HANDLE OF BDDT
DBFORK:	Z	;POINTS TO EITHER IDFORK OR BDFORK
UFORK:	Z	;-1 OR HANDLE OF USER UNDER IDDT, BDDT

DDTFLG:	Z	;-1 IF DDT HAS BEEN MERGED INTO SUBSIDIARY FORK

NPAGE:	Z	;-1 OR XWD FORK HANDLE, ADDR FOR PAGE MAPPED AT "PAGEN"

EFORK:	Z	; EPHEMERON FORK HANDLE
XFORK:	Z	;FORK HANDLE FOR SPECIAL INFERIOR EXEC FORK

;AUTOLOGOUT CRAP
STRTIM:	Z	;DATE AND TIME EXEC WAS STARTED, IN "GTAD" FORMAT
TTYACF:	Z	;TTY ACTIVITY FLAG: AOS'D FOR EACH CHARACTER IN OR OUT
ALOFH:	Z	;AUTOLOGOUT FORK HANDLE, OR 0 IF NEVER STARTED, OR
		;-1 IF ALREADY KILLED.

;2 BLOCKS CONTAINING TTY MODE WORD, TAB STOPS (3 WORDS),
; CONTROL CHARACTER OUTPUT CONTROL INFO (CCOC) (2 WORDS)
; TERMINAL INTERRUPT WORDS (2 WORDS)
; SUBSYTEM NAME (1 WORD)

;	PROGRAM'S VALUES: SAVED ON ↑C, RESTORED ON CONTINUE.
PTTYMD:	BLOCK NTTYMD
;	EXEC'S VALUES: USED DURING COMMAND INPUT.
ETTYMD:	BLOCK NTTYMD
SUBSYS=PTTYMD+10	;SUBSYSTEM NAME IN SIXBIT

;SUPERIOR'S SUBSYSTEM NAME, RESTORED BY "QUIT"
SUPSUB:	Z


;FOR CONTROL T ROUTINE
CTLIM0:	Z	;DELTA1 (15 SEC) PLUS TIME OF 1ST ↑T
CTLIM1:	Z	;DELTA2 (1 MIN) PLUS TIME OF LAST VERBOSE ↑T TYPEOUT
;PRIMRY CIJFN COJFN CRJFNI CRJFNO CREDIF CREDOF CERET CTUUO CSTRR FRSTFR %EDAYT CSBUFP ERCOD ERPC DWNMSF

PRIMRY:	Z	;SAVED PRIMARY JFNS AT ENTRY
CIJFN:  Z       ;COMMAND (PRIMARY) INPUT JFN
COJFN:	Z	;PRIMARY OUTPUT JFN

;PRIMARY INPUT AND OUTPUT JFN'S SAVED AT ↑C OUT OF REDIRECTED I/O
; OPERATION.  EACH OF THESE IS SIGNIFICANT ONLY IF CORRESPONDING
; FLAG IS -1.
CRJFNI:	Z
CRJFNO:	Z
;INPUT AND OUTPUT REDIRECTION FLAGS.
;EACH CAN INDEPENDENTLY HAVE THE VALUES:
; 	0  NORMAL
;	-1 INPUT OR OUTPUT IS NOW REDIRECTED
;	1  ↑C'D (OR ERRORED?) OUT OF REDIRECTION,
;		JFN OF LAST USED REDIRECT FILE IN CRJFNI/O.
CREDIF:	Z
CREDOF:	Z

CERET:	Z	;WHERE TO GO AFTER ERROR MESSAGE. NORMALLY "RERET"
		;WHICH GOES BACK TO CMDIN, BUT IS CHANGED DURING SUB-CMD
		;INPUT AS FOR "DIRECTORY"

CTUUO:  Z       ;TEMPORARY FOR UUO DISPATCHER

CSTRR:  Z       ;USED BY "CSTR" TO SAVE RETURN FOR "MORE"

FRSTFR:	Z	;RETURN FROM "FRSTF" SUBR IN XSUBRS.MAC, SAVED FOR USE
		;BY "NEXTF", ALSO IN XSUBRS.MAC

%EDAYT:	Z	;DATE & TIME SAVED FROM %D TO %E (ETYPE UUO, XSUBRS.MAC)

CSBUFP:	Z	;POINTER INTO CSBUF (SEE SAME)

ERCOD:	Z	;ERROR CODE FROM JSYS ERROR RETURN OR FAKE ITRAP

ERPC:	Z	;PC FOR FAKE INSTRUCTION TRAP FOR SIMULATED JSYS'S

DWNMSF:	Z	;-1 OR "TIME" OF NEXT DOWNTIME CHECK
;DOWNTM UPTIME WHYHLT FRAME IUSRNM EDFILE DEVICE DIRNO OLDDIR OUTDSG INDSG LPNAME LPEXT LPFDB LFPOS GHEAD HEAD HEDLNO SPCG WIDTH LENGTH L35 L50 PAGENO PAGEN1 BESPTR BESCOR BESLNO PPRINT LEV1PC LEV2PC LEV3PC

;STORAGE FOR "HALT"
DOWNTM:	Z
UPTIME:	Z
WHYHLT:	Z

;STORAGE USED BY TTYNUM FOR "LINK" AND "ADVISE"
FRAME:	Z	;P SAVED DURING TTYNUM


;STORAGE USED BY SUBSYS LOOKUP
IUSRNM:	BLOCK ↑D10

;STORAGE USED BY "EDIT"
EDFILE:	BLOCK EDFILL	;HOLDS NAME OF FILE BEING EDITTED

;STORAGE LOCATIONS USED BY "DIRECTORY" AND OTHER COMMANDS FOR
; INFORMATION ABOUT ARGUMENTS
DEVICE:	Z	;DEVICE IDENTIFIER
DIRNO:	Z	;DIRECTORY NUMBER
OLDDIR:	Z	;PREVIOUS DIRECTORY NUMBER
OUTDSG:	Z	;DESIGNATOR OF FILE TO PRINT ON
INDSG:	Z	;SOURCE JFN (TYPE, LIST)

;EXECUTION TIME STORAGE FOR "DIRECTORY" AND OTHER COMMANDS
LPNAME:	Z	;0 OR STRING POINTER TO LAST PRINTED NAME
LPEXT:	Z	;0 OR STRING POINTER TO LAST PRINTED EXTENSION
LPFDB:	Z	;0 OR LOCATION OF FDB FOR WHICH PRINTING IS INCOMPLETE
LFPOS:	Z	;LINE POSITION, AS - # COLS USED OVER MINIMUM

;STORAGE FOR "LIST" AND "TYPE" COMMANDS
GHEAD:	Z	;0 OR BYTE POINTER TO SUBCOMMAND-GIVEN HEADING
HEAD:	Z	;0 OR PTR TO HEAD BEING USED FOR THIS FILE, INCL "PAGE "
HEDLNO:	Z	;# LINES IN HEADING, INCL EOLS BEFORE AND AFTER
SPCG:	Z	;0 FOR SINGLE SPACING, 1 FOR DOUBLE, ETC
WIDTH:	Z	;PAGE WIDTH IN COLUMNS
LENGTH:	Z	;PAGE LENGTH IN LINES
		; = LAST LINE AT WHICH TO BREAK PAGE IF NO ↑L
L35:	Z	;FIRST LINE AT WHICH TO BREAK PAGE IN ABSENCE OF ↑L
L50:	Z	;PREFERRED LINE AT WHICH TO BREAK PAGE
PAGENO:	Z	;PAGE NUMBER, INCREMENTED AT ↑L
PAGEN1:	Z	;SUBPAGE NUMBER, INCREMENTED WHEN OVERLONG PAGE IS SPLIT
BESPTR:	Z	;POINTER TO BEST PLACE IN OUTBUF YET SEEN TO BREAK PAGE
BESCOR:	Z	;"SCORE" ASSOCIATED WITH BESPTR
BESLNO:	Z	;LINE # AT BESPTR
PPRINT:	Z	;POINTER TO BLOCK OF WORDS SPECIFYING PAGES TO LIST,
		;EACH WORD BEING XWD MIN,MAX, 0 TERMINATING BLOCK.


;PSEUDO-INTERRUPT PC STORAGE WORDS
LEV1PC:	Z
LEV2PC:	Z
LEV3PC:	Z
;PD CBUF CBUFE CWBUF CJFNBK CSBUF CSBUFE PPATS SGTNAM SGTAC1 SGTAC2 PAGEN

;BUFFERS

PD:     BLOCK PDL       ;PUSHDOWN
		;WHILE A PUSHDOWN OVERFLOW ERROR MESSAGE IS BEING 
		; TYPED PD OVERFLOWS INTO CBUF, WHICH IS OK.

CBUF:   BLOCK CBUFL     ;BUFFER FOR ENTIRE COMMAND TEXT,
	                ;INCLUDING STUFF ECHOED BY ALT MODE.
CBUFE:	Z		;END OF CBUF

CWBUF:  BLOCK 4                 ;BUFFER IN WHICH TO SET UP WORD JUST SO
                                ;FOR "FSYM" TABLE SEARCH.

CJFNBK:	BLOCK 11	;ARGUMENT BLOCK FOR "GTJFN" JSYS
			;ALWAYS ALL 0 EXCEPT WORDS 0, 1, 3, 4, 5.

CSBUF:	BLOCK CSBUFL	;BUFFER IN WHICH TO SET UP AND SAVE STRINGS
			;USED AS JSYS ARGUMENTS (BUFFF SUBR),
	LOC .!777-40	;USE REST OF PAGE EXCEPT FOR PATCH AREA
CSBUFE:			;END OF CSBUF. EVEN IF STRINGS OVERFLOW BEYOND
			;THIS POINT IT USUALLY WON'T DO ANY HARM.

PPATS: PPAT: BLOCK 40              ;PRIVATE PATCH AREA
	LOC .!777+1001-3*SGTBLN	;LOCATE HASH TABLES AT TOP OF NEXT PAGE
SGTNAM:	BLOCK SGTBLN		;HOLDS SIXBIT NAME (ARGUMENT TO SYSGT)
SGTAC1:	BLOCK SGTBLN		;HOLD AC1 RETURNED BY SYSGT
SGTAC2:	BLOCK SGTBLN		;HOLDS AC2 RETURNED BY SYSGT


CSZ4==.-1  ;END OF AREA TO ZERO AT STARTUP (BEGINS AT CSZ1)


;BUFFERS FOR MAPPING PAGES

	LOC <.+777>&777000	;SET LOCATION TO NEXT PAGE BOUNDARY
				;IF NOT ALREADY THERE

PAGEN:	BLOCK ↑D512	;POSSIBLE PAGE MAPPED FOR EXAMInE, DEPOSIT, ETC.
			;OR LOOKING AT JOBDAT.
			;IF A PAGE IS MApPED HERE "NPAGE" IDENTIFIES IT.
;EXEC ..JBSYM ..JBUSY VERTXT VERSN PATVER PATS CUUOT CUUO

SUBTTL PDP-10 TENEX EXECUTIVE

; 10/50 JOB DATA AREA
.JBSYM=116
.JBUSY=117
.JBSA=120
.JBREN=124
.JBOPC=130
.JBERR=42

;TENEX ENTRY VECTOR

;N.B.  "EXEC" MUST BE THE FIRST SYMBOL IN RELOC SECTION

EXEC:	JRST REE		;START ENTRY
	JRST REE		;REENTER ENTRY
	JRST AUTOST		;AUTO STARTUP ENTRY
EVECL==.-EXEC

;POINTERS TO DEFINED AND UNDEFINED SYMBOL TABLES
;SAVED HERE FROM .JBSYM AND .JBSYM WHEN THOSE PAGES ARE
; REMOVED FOR SHARABLE SUBSYSTEM

..JBSYM: 0
..JBUSY: 0

;EXEC VERSION, PRINTED ON STARTUP AND BY "VERSION" COMMAND
; NOTE THESE GET SETUP AUTOMATICALLY FROM THE EXTENSION OF
;  <SYSTEM>EXEC.SAV;0  WHEN STARTED THE FIRST TIME AFTER A
;  REASSEMBLY.  (NOTE: THE INPUT COMMAND FILE DOES THIS TO MOVE
;   SYMBOL POINTERS ALREADY).

VERTXT:	ASCIZ / Exec 1.54/		;MAJOR AND MINOR VERSIONS
VERSN:	↑D154
PATVER:	0			;# TIMES PATCHED

;PATCH AREA

PATS: PAT: BLOCK 200

;UUO DISPATCH TABLE

CUUOT:  EXP 0,%ERR,%TYPE,%KEYW
        EXP %NOI,%$TYPE,%ALLOW
	EXP %ALTYP,%$ERR,%ETYPE,%GTB
	EXP %PRINT,%TRAP,%.$ERR,%INHEL
	EXP %SBCOM

;UUO DISPATCHER

CUUO:   MOVEM A,CTUUO
        HLRZ A,40
        LSH A,-↑D9
        HRRZ A,CUUOT(A)
        EXCH A,CTUUO
        JRST @CTUUO
;.VERSI VERSI1 VERSI2 CMD2A3

;SUBROUTINE TO TYPE SYSTEM AND EXEC VERSIONS.
;USED AT STARTUP TO PRINT SIGN-ON HEARLD, AND IS ALSO THE
; EXECUTION ROUTINE FOR "VERSION" COMMAND.

.VERSI:	PRINT " "
	MOVE A,[SIXBIT /SYSVER/]
	CALL $SYSGT		;SYSTEM NAME AND VERSION
	HLLZ D,B		;LENGTH,,INDEX
	HRRZ E,B		;TABLE #
VERSI1:	GTB (E)			;GET A DATA WORD FROM TABLE (USES D)
	MOVE B,A
	MOVEI C,5		;PRINT 5 CHARS FROM EACH WORD
	SETZ A,
	LSHC A,7
	JUMPE A,VERSI2		;END ON NULL
	PRINT (A)
	SOJG C,.-4
	AOBJN D,VERSI1		;ALSO END ON END OF TABLE

;"EXEC" AND ITS VERSION

VERSI2:	UTYPE VERTXT	;VERSION TEXT
	SKIPN B,PATVER
	 JRST CMD2A3	;DON'T PRINT # PATCHES IF NONE
	PRINT "."
	MOVE A,COJFN
	MOVEI C,↑D10	;DECIMAL OUTPUT
	NOUT
	 CALL JERRC	;ERROR, NUMBER IN C
CMD2A3:	PRINT EOL
	RET
;AUTOST AUTO0 REE

;AUTOSTARTUP ENTRY

AUTOST:	SETZM CSZ1		;ZERO WRITABLE PAGE
	MOVE C,[CSZ1,,CSZ1+1]
	BLT C,CSZ4
	MOVEM A,APJFN		;PRIMARY IO FOR AUTOSTARTED FORK
	MOVEM B,AUTFLG		;USE JFN AS FLAG FOR AUTOSTARTUP JOB

AUTO0:	MOVE P,[IOWD PDL,PD]
	CALL INFER
	 SETOM 0
	AOS 0
	MOVEM STRTAC
	JRST EXEC0A

;REENTER ENTRY

REE:	SKIPE CINITF		;IS EXEC INITIALIZED?
	JRST EXEC0B
;EXEC0 EXEC0A EXEC06

;EXEC COMMAND INTERPRETER IS INITIALLY STARTED HERE

EXEC0:

;ZERO WRITEABLE PAGE
        SETZM CSZ1
        MOVE A,[CSZ1,,CSZ1+1]
        BLT A,CSZ4

;SET UP 41 FOR UUO'S, P=17 FOR PUSHDOWN POINTER
EXEC0A:	MOVE A,[CALL CUUO]
        MOVEM A,41
        MOVE P,[IOWD PDL,PD]

;CLEAR FLAGS
	SETZ Z,

;RANDOM THINGS
	SETOM FORK		;SAY NO INFERIOR FORK
	SETOM LRFORK		;SAY NO FORK HAS BEEN RUN
	SETOM IDFORK		;SAY NO IDDT FORK
;;	SETOM BDFORK		;SAY NO BDDT FORK
	SETOM UFORK		;SAY NO FORK UNDER IDDT, BDDT
	SETOM EFORK		;SAY NO EPHEMERAL FORK
	SETOM XFORK		;SAY NO EXEC FORK
	SETOM NPAGE		;SAY NO PAGE OF INFERIOR IS MAPPED
	SETOM MSGTIM		;DO "MAIL WATCH OFF" (DEFAULT)
;	SETOM PRNTIM		;DO "PRINTER WATCH OFF" (DEFAULT)

	MOVE A,[EDFILE+1,,EDFILE+2]
	MOVEM A,EDFILE
	MOVE A,[ASCIZ /MAC/]
	MOVEM A,EDFILE+2
		; HERE GOES SPECIAL CASE INITIAL FILENAMES/EXTENSIONS

;ON FIRST STARTUP, MOVE SYMBOL TABLE POINTER INTO ONE OF THE CODE PAGES,
; SO IT WILL BE KEPT THRU SHARABLE SAVES.
	MOVE C,.JBUSY		;10/50 UDEFINED POINTER
	SKIPE D,.JBSYM		;GET 10/50 STYLE PTR, SKIP IF NONE.
	SKIPE ..JBSYM		;NO SKIP IF ALREADY MOVED
	 JRST EXEC0B		;NO PTR OR ALREADY MOVED
	MOVE A,[400000,,<..JBSYM/1000>]
	RPACS			;READ PAGE ACCESSIBILITY
	TLNN B,(1B3!1B9)	;..JBSYM WRITE-PROTECTED?
	 JRST EXEC0B		;YES
	MOVEM D,..JBSYM		;NO, STORE SYMBOL TABLE POINTER.
	MOVEM C,..JBUSY		;AND UNDEFINED POINTER


;NOW SETUP THE VERSION NUMBERS

;EXEC05:	MOVSI 1,(1B2!1B17)	;OLD, SHORT
;	HRROI 2,[ASCIZ /<SYSTEM>EXEC.SAV/]
;	GTJFN
;	 JRST EXEC0B		;CANNOT DO IT, DOESN'T MATTER.
;	MOVE 2,[1,,FDBVER]
;	MOVEI 3,3
;	GTFDB
;	HLRZS 3			;GET VERSION NUMBER
;	IDIVI 3,↑D100		;SPLIT OFF THE PATCH NUMBER
;	ADDI 4,1
;	CAMN 3,VERSN		;NEW VERSION OF OLD PROGRAM?
;	MOVEM 4,PATVER		;YES, SAVE INCREMENTED PATVER
;	RLJFN
;	 JFCL
;
;;NOW SET THE ENTRY VECTOR

EXEC06:	MOVEI 1,400000		;THE EXEC FORK
	MOVE 2,[EVECL,,EXEC]
	SEVEC			;IN CASE NEW "LOADER" NOT USED

EXEC07:	MOVE 1,VERSN
	IMULI 1,↑D100
	ADD 1,PATVER
	HRLI 1,(1B0!1B17)	;FOR OUTPUT, SHORT
	HRROI 2,[ASCIZ /EXEC.SAV/]	;IN CONNECTED DIRECTORY
	GTJFN
	 JRST EXEC0B
	HRLI 1,400000		;FORM FORK,,JFN
	MOVEI 2,EXEC		;MACRO CANT TO DIVISION WITH RELOC'S
	IDIVI 2,1000		;FIRST PAGE TO SSAVE
	MOVEI 3,520000(2)	;RCX BITS
	SUBI 2,100		;DO THROUGH PAGE 77
	HRLZS 2			;NEGATIVE PAGE COUNT
	HRR 2,3
	SETZ 3,
	SSAVE
	HALTF
;EXEC0B

EXEC0B:

;SET UP PRIMARY INPUT AND OUTPUT JFN'S
;THESE REMAIN CONSTANT AT LEAST AT PRESENT.

	MOVEI 1,400000
	GPJFN
	MOVEM 2,PRIMRY		;SAVE FOR ↑C, ERRORS ETC
	MOVEI A,100
	MOVEM A,CIJFN
	MOVEI A,101
	MOVEM A,COJFN

;INITIALIZE PROCESS PSI SYSTEM,
; DONE EARLY SO ERRORS IN REST OF INITIALIZATION WILL BE HANDLED.
;ENABLE ALL ERROR CHANNELS BUT OVERFLOW,
; ALSO CHANNEL 1 FOR ASSIGNMENT TO ↑C BELOW,
; AND 2 FOR AUTOLOGOUT.

	MOVEI A,B0		;SAY THIS FORK
	MOVE B,[LEVTAB,,CHNTAB]
	SIR		;SET UP TABLE ADDRESSES
	MOVE B,[360777500000]		;CHANNELS 1-4,9-18, 20.
	AIC		;ACTIVATE SPECIFIED CHANNELS
	EQV B,[1B0+1B19];DON'T CHANGE CHANS USED BY MINI-EXEC. 4/30/70.
		;ABOVE FOR DEBUGGING .  SETCA B, TO DEACTIVATE ALL.
	DIC		;DEACTIVATE ALL OTHERS
	EIR		;ENABLE PROCESS PSI SYSTEM
;EXEC0C

;INITIALIZE THE EXEC AND PROGRAM TTY MODE BLOCKS
; WORD-0 OF PTTYMD IS USED AS FLAG TO INDICATE WHETHER OR NOT WE
; HAVE A TTY.  CALLS TO LTTYMD OPERATE ONLY ON SUBSYS
; NAME IF WORD-0 IS ZERO.  THIS WILL BECOME NON-ZERO AS
; SOON AS WE HAVE A TTY.  NOTE: THIS CAN HAPPEN HERE, IF
; THE "GET" DURING AUTOSTARTUP IS BAD, OR IN RTTYMD
; DUE TO ↑C OUT OF AUTOSTARTED JOB WHICH WAS STARTED DETACHED.

EXEC0C:	GETNM			;SUPERIOR-SET SUBSYS NAME
	MOVEM 1,SUPSUB		;SAVE FOR "QUIT"
	MOVE A,[INETTY,,ETTYMD]	;INITIAL EXEC MODES
	BLT A,ETTYMD+NTTYMD-1	;INCLUDING MODIFIED CCOC, TIW AND SUBSYS
	MOVE A,[INPTTY,,PTTYMD]	;INITIAL TTY FOR USER
	BLT A,PTTYMD+NTTYMD-1	;JUST A NORMAL TTY
	GJINF
	CAMN 4,[-1]		;ARE WE DETACHED?
	JRST CMDIN1		;YES, LEAVE 0 IN ETTYMD, PTTYMD
	MOVE 2,[1B3+↑D66B10+↑D72B17+17B23+2B25+1B26+1B29+1B31]
	MOVEM 2,ETTYMD+0
	MOVEM 2,PTTYMD+0
;CMDIN1 CMDIN2 ERRET

CMDIN1:	SKIPE CINITF		;ARE WE INITIALIZING?
	JRST CMDIN2		;NO, NO SIGN-ON HEARLD
	SKIPN AUTFLG		;NO HERALD FOR AUTOSTARTUP JOBS
	TLOA Z,F1		;SAY PRINT SIGN-ON HEARLD

;COMMANDS THAT RUN PROGRAM RETURN HERE WHEN IT STOPS.
;START, CONT, REENTER, RUN, ERUN, <SUBSYSTEM NAME>, GOTO.
;RE-ENTRY JOINS MAIN FLOW HERE

CMDIN2:

;↑C AND COMMAND ERRORS COME BACK HERE.
;AFTER ↑C IT IS NECESSARY TO EXECUTE CODE TO FIND OUT WHETHER LOGGED IN,
; HAVE INFERIOR FORK, UPDATE CAPABILITIES, KILL AUTOLOGOUT FORK,
; ETC IN CASE INTERRUPTED COMMAND WAS LOGIN, RUN, ETC.

ERRET:	TLZ Z,F1		;SAY NO SIGN-ON MESSAGE

;MAKE SURE ↑C PSI CHANNEL ACTIVATED
; (IT IS TURNED OFF DURING PART OF "LOGIN" AND "RESET")

	MOVEI A,B0
	HRLZI B,B1
	AIC
	MOVEI E,ETTYMD		;PUT EXEC'S TTY MODES INTO EFFECT
	CALL LTTYMD		;IF THEY EXIST.  SETNM, TOO.

	MOVEI A,RERET		;SAY WHERE TO GO ON ERROR WHILE TYPING
	MOVEM A,CERET		; ...LOGIN MESSAGE

	TLZN Z,F1		;SIGN-ON MESSAGE, FIRST TIME ONLY
	JRST CMDN2B		;NO
	PRINT EOL
	CALL .VERSI		;PRINT SYSTEM AND EXEC VERSIONS

	HRLZI A,B0!B1		;"FACT FILE OR LOGGING TTY" ENABLED
	TMON			;SKIP IF EITHER EXISTS
	JRST [	UTYPE [ASCIZ / *****ACCOUNTING OFF*****
/]
		JRST .+1]
	CALL LGNCHK		;WARN IF LOGINS PROHIBITTED
	JUMPE A,CMDN2B		;LGNCHK SAID OK TO LOGIN
	CALL CRIF
	TYPE <Attach to existing job is permitted>
	PRINT EOL
;CMDN2B CMDN2C

;SAY INITIALIZATION HAS COMPLETED SUCCESSFULLY.
;UNTIL CINITF><0, ERROR ROUTINES HALT RATHER THAN TYPE MESSAGES,
; AND "REENTER" DOES A "START".

CMDN2B:	SETOM CINITF

;FIND OUT IF THIS JOB IS LOGGED IN. (MIGHT BE AT STARTUP IF SUBSIDIARY,
;  OR A SUBSYSTEM COULD LOG JOB IN.)
	GJINF			;LOGIN DIR # IN A, 0 IF NOT LOGGED
	MOVEM A,CUSRNO		;SAVE LOGIN DIR # OR -1
	SETZM LOCAL	;TTY LINE # IS IN D
	MOVE	A,[SIXBIT \LOCAL\]
	SYSGT
	TRNN B,-1
	 JRST CMDN2C
	HRRZ A,B
	HRL A,D
	GETAB
	 JRST CMDN2C
	JUMPL A,CMDN2C		;NOT A LOCAL TERMINAL
	SETOM LOCAL
	PUSH P,A		;.RAISE SMASHES "A"
	CAILE A,2		;TERMINAL TYPES 0-2 USE ALTMODE
	 CAIN A,10		;SO DOES 10 (LA30)
	  CALL .RAISE
	POP P,A
	PUSH P,[CMDN2C]		;SUBROUTINE RETURN
	HLRZ C,TRMTAB(A)	;GET PAGE LENGTH
	PUSH P,C
	HRRZ C,TRMTAB(A)	;GET PAGE WIDTH
	PUSH P,C
	MOVE A,COJFN
	JRST SCOPE2		;SET THEM

;KILL AUTOLOGOUT FORK IF IT EXISTS BUT LOGGED IN.
CMDN2C:	SKIPLE CUSRNO		;SKIP IF NOT LOGGED IN
	SKIPG A,ALOFH		;FORK THAT LOGS OUT ABANDONED JOBS
	JRST .+3
	SETOM ALOFH		;SAY ITS KILLED (DON'T RETRY ON FAILURE)
	KFORK			;KILL IT
;CMDN2D

;ENABLE SPECIAL CAPABILITIES

CMDN2D:	MOVEI A,B0		;SAY THIS FORK
	RPCAP			;GET SPECIAL CAPABILITIES POSSIBLE IN 2
	HLLZ C,B		;ENABLE ALL PROCESS (LH) CAPABILITIES
	SKIPE PRVENF		;IF "ENABLE" COMMAND IS IN EFFECT,
	HRR C,B			;ALSO ENABLE RH (USER) CAPABILITIES.
	EPCAP

	MOVEI 1,400000
	CIS

	MOVE A,[CTRLC,,1]
	TLNE C,B0		;TEST SPEC CAP BIT 0
	ATI			;ASSIGN ↑C TO CHAN 1

	MOVE A,[CTCODE,,3]
	ATI			;ASSIGN ↑T TO CHAN 3

	MOVE A,[HUCODE,,4]
	ATI			;ASSIGN CARRIER OFF TO CHAN 4


;PRINT "YOU HAVE A MESSAGE" IF APPROPRIATE
;HERE SO DONE EVEN AFTER ↑C DURING LOGIN MESSAGE
	SKIPE MESMSF		;SKIP IF WE NEEDN'T CHECK FOR A MESSAGE
				;(NON-0 FROM LOGIN TO SUCCESSFUL
				;COMPLETION OF "MESMES")
	CALL MESMES		;SUBROUTINE NEAR "LOGIN"
	JFCL			;ALSO PRINTS DSK ALLO. EXCD.
				;AND PENDING SHUDOWN TIME
;CMDIN4

;HERE WHEN READY TO INPUT A COMMAND.
;ALL COMMANDS RETURN HERE OR ABOVE HERE WHEN DONE.

CMDIN4:	MOVEI E,ETTYMD
	CALL LTTYMD		;IN CASE LAST COMMAND DIDN'T RESTORE IT
	SETO A,
	CAME A,NPAGE
	CALL MAPPF		;DON'T LEAVE FORK PAGES MAPPED
	SETZM CSZ1		;ZERO STORAGE
	MOVE A,[CSZ1,,CSZ1+1]
        BLT A,CSZ2

;INITIALIZE WHAT NEEDS INITIALIZING
        MOVE BFP,[POINT 7,CBUF,-1] ;BYTE POINTER INTO COMMAND BUFFER,
		                ;IN WHICH ENTIRE LINE IS ACCUMULATED.
				;STAYS IN BFP.
        MOVE P,[IOWD PDL,PD]	;INIT PD POINTER

	MOVE A,[IOWD JBUFL,JBUF] ;INIT PTR INTO JFN BUFFER
	MOVEM A,JBUFP		;..
	SETOM 1(A)		;INIT JFN BUFFER TO -1'S: 0 IS A JFN.
	AOBJN A,.-1		;..

	MOVE A,[POINT 7,CSBUF,-1] ;INIT PTR INTO STR BUF FOR JSYS ARGS
	MOVEM A,CSBUFP

	MOVEI A,RERET		;REGULAR ERROR RETURN ADDRESS
	MOVEM A,CERET		;SAY WHERE TO GO AFTER PRINTING ERR MSG

;CLEAR SOME FLAGS
        SETZ Z,	         	;CLEARS PUNCTF, STCF, BAKFF, ETC.

	SETZB KWV1,KWV		;NO SPECIAL BITS ON IN COMMAND KEYWORD
				; TABLE VALUE. THIS IS IN CASE SOME
				; SPECIAL SYNTAX
				; NEVER SETS KWV1 BUT CALLS "CONF".
				; THE ONLY SUCH CASES ARE
				; <SUBSYSTEM NAME> AND INPUTTING
				; DATE AND TIME.  6/30/70.
;CMDN5B

;REQUEST DATE AND TIME IF SYSTEM DOESN'T HAVE THEM.
;THIS MUST BE INSIDE COMMAND LOOP SO IT WILL BE REPEATED IF ERROR
; OR ↑C ABORTS FIRST ATTEMPT.

	SKIPN AUTFLG		;DON'T IF AUTOJOB
	SKIPE DTSF		;NON-0 IF HAVE DATE AND TIME
	JRST CMDN5B		;...AND HAVE BEEN HERE BEFORE
	GTAD			;FLAG NOT SET YET, GET DATE AND TIME
	CAME A,[-1]		;-1 SAYS SYSTEM DATE & TIME NOT SET
	JRST CMDN5B		;SYSTEM HAS DATE AND TIME.

;SYSTEM HAS NO DATE AND TIME, GET SAME. SUBR INDT (WITH ↑E SET IN
;X1CMD.MAC) INPUTS, CONFIRMS, AND SETS TIME & DATE. KWV1 MUST BE 0 NOW!
	MOVE 1,CIJFN
	SIBE			;INPUT ALREADY TYPED?
	JRST [	TYPE < TAD= >	;YES, GIVE SHORT MESSAGE
		JRST .+2]
	TYPE < Enter date and time as MM/DD/YY HH:MM -- >
	CALL INDT
CMDN5B:	SETOM DTSF		;SAY SYSTEM HAS DATE AND TIME.
				; THIS AVOIDS
				; DOING GTAD EVERY TIME THRU LOOP.
;CMDN5D

;NOW THAT SYSTEM DEFINITELY HAS DATE & TIME, INITIALIZE "AUTOLOGOUT"
;STUFF IF NECESSARY.
	SKIPN AUTFLG		;IF AUTO STARTUP JOB, OR ...
	SKIPLE CUSRNO		; ALREADY LOGGED IN,
	 JRST CMDN5E		; NOT RELEVANT.
	SKIPE ALOFH		;ALO FORK STARTED?
	JRST CMDN5D		;YES, ALO INITIALIZATION ALREADY DONE.
	GTAD			;SAVE STARTUP TIME FOR USE IN
	MOVEM A,STRTIM		;"ALOTST" SUBR


;START UP FORK TO WATCH FOR ABANDONED JOB (NO TTY ACTIVITY FOR
;N SECONDS) AND PSI THIS FORK IF THAT OCCURS.
	SETZ A,
	CFORK			;FORK WHICH LOOKS FOR NO TTY ACTIVITY
	 CALL [	SETOM ALOFH	;ON ERROR THIS PREVENTS INFINITE
		JRST JERR]	;...RETRY LOOP.
	MOVEM A,ALOFH		;SAVE HANDLE FOR KILLING LATER.
	HRLZI A,400000
	HRLZ B,ALOFH
	HRLZI C,B2+B3+B4
	PMAP			;MAP PAGE 0 (STORAGE) INTO FORK
	MOVEI A,ALOFRK
	LSH A,-↑D9		;GET PAGE # OF ALO ROUTINE
	HRLI A,400000
	MOVEI B,ALOFRK
	LSH B,-↑D9		;MUST SHIFT AT RUN TIME CAUSE RELOCATION
	HRL B,ALOFH
	PMAP			;MAP CODE PAGE INTO FORK
	AOS A
	AOS B
	PMAP			;GIVE IT THE NEXT PAGE TOO.  MAY CROSS
	MOVE A,ALOFH
	MOVEI B,ALOFRK
	SFORK			;START ALO FORK

;JOB ISN'T LOGGED IN, SEE IF ITS TIME TO AUTO-LOGOUT IT.
CMDN5D:	CALL ALOTST
;CMDN5E CMDN6 CMDN6A CMDN6B CMDN6C CMDN6D CMDN6E CMDN6J

CMDN5E:	SKIPN AUTFLG		;AUTOSTARTUP JOB ?
	 JRST CMDN6		;NO
	SETOM ALOFH		;YES, DISABLE AUTO LOGOUT FORK
	MOVE A,AUTFLG		;GET JFN OF PROG TO START
	MOVEM A,CJFN1		;AND SET FOR GET
	SETZM AUTFLG		;CLEAR AUTOSTART FLAG
	CALL RESET
	CALL $GET2		;DO THE GET AFTER CFORK IF NEEDED
	MOVE A,FORK
	MOVE B,APJFN
	SPJFN
	JRST ..STRT


;DO PERIODIC CHECK FOR NEW MAIL ARRIVAL

CMDN6:	SKIPL MSGTIM		;IF "MAIL WATCH OFF"
	SKIPG CUSRNO		;OR NOT LOGGED IN
	 JRST CMDN6D		;FORGET THE CHECK
	TIME			;GET MILLISECOND TIME
	CAMG A,MSGTIM		;PASSED DEADLINE FOR MAIL CHECK?
	 JRST CMDN6D		;NO

CMDN6A:	MOVEI A,CMDN6C		;SET DISPATCH IN CASE CHKMSG BOMGS OUT
	MOVEM A,CERET
	MOVE A,CUSRNO		;OUR USER #
	CALL CHKMSG		;SKIP IF USER IN A HAS NEW MAIL
	 JRST CMDN6C		;HE DOES NOT. JUST MAKE NEW DEADLINE.

CMDN6B:	CALL CRIF
	TYPE <[You have new mail]>
	PRINT EOL

CMDN6C:	TIME			;GET "NOW" AND TICKS/SECOND
	MOVEI C,↑D<10*60>	;10 MINUTES OF SECONDS
	IMULI C,0(B)		;CONVERT TO TICKS
	ADDM C,A		;NEXT DEADLINE
	MOVEM A,MSGTIM
	MOVEI A,RERET		;RESTORE NORMAL ERROR DISPATCH
	MOVEM A,CERET
CMDN6D:


;;DO PERIODIC CHECK OF PRINTER DIRECTORY

CMDN6E:;	SKIPL PRNTIM		;IF "PRINTER WATCH OFF"
;	SKIPG CUSRNO		;OR NOT LOGGED IN
;	 JRST CMDN6J		;FORGET THE PRINTER CHECK
;	TIME			;GET MILLISECOND TIME
;	CAMG A,PRNTIM		;PASSED DEADLINE FOR PRINTER CHECK?
;	 JRST CMDN6J		;NO
;
;CMDN6F:	CALL CRIF		;ENSURE AT LEFT MARGIN
;	MOVEI A,CMDN6H		;SET SPECIAL ERROR DISPATCH
;	MOVEM A,CERET
;	HRRZ A,CUSRNO		;OUR USER #
;	CALL CHKPRN		;CHECK THE SPOOLER
;	 JRST [	UTYPE [ASCIZ /[Line printer output done]/]
;		PRINT EOL
;		SETOM PRNTIM	;CANCEL SUBSEQUENT CHECKING
;		JRST CMDN6I]
;
;CMDN6G:	TYPE <[Your listing has not finished]>
;	PRINT EOL
;
;CMDN6H:	TIME			;GET "NOW" AND TICKS/SECOND
;	MOVEI C,↑D<60*5>	;5 MINUTES OF SECONDS
;	IMULI C,0(B)		;CONVERT TO TICKS
;	ADDM C,A		;NEXT DEADLINE
;	MOVEM A,PRNTIM
;CMDN6I:	MOVEI A,RERET		;RESTORE NORMAL ERROR DISPATCH
;	MOVEM A,CERET
CMDN6J:
;CMDN6K

;DO PERIODIC CHECK FOR NEWLY-SCHEDULED DOWNTIME

	SKIPL DWNMSF		;IF DOWNTIME ALREADY PRINTED
	SKIPG CUSRNO		;OR NOT LOGGED IN
	 JRST CMDN6K		;FORGET THE DOWNTIME CHECK
	TIME			;GET THE MILLISECOND TIME
	CAMG A,DWNMSF		;TIME TO CHECK AGAIN YET?
	 JRST CMDN6K		;NO
	CALL DWNTIM		;YES, CHECK FOR AND PRINT OUT DOWNTIME
	TIME			;GET "NOW" AND TICKS/SECOND
	MOVEI C,↑D<60*30>	;30 MINUTES OF SECONDS
	IMULI C,0(B)		;CONVERT TO TICKS
	ADDM C,A		;NEXT DEADLINE
	SKIPL DWNMSF		;UNLESS CANCELLED DUE TO PRINTOUT
	MOVEM A,DWNMSF
CMDN6K:
;CMDN7 CIN0A

;PRINT READY CHARACTER AND INPUT AND DECODE COMMAND

CMDN7:	CALL READY		;PRINTS "@" OR "!" IF PRIV CMDS ENABLED

;BEGIN INPUTTING AND DECODING A COMMAND

;FIRST, INPUT FIRST FIELD. MUST INPUT WHOLE FIELD SO EDITING WORKS!
; DISTINGUISH 3 CASES:
;	COMMAND BEGINS WITH A SPECIAL CHARACTER
;	COMMAND BEGINS WITH A WORD
;	COMMAND BEGINS WITH AN OCTAL NUMBER

	TLO Z,NEOLF	;SAY DON'T ECHO EOL'S, BECAUSE THIS INPUT
			;FIELD MAY BE A SUBSYSTEM NAME, AND GTJFN
			;PRINTS AN EOL IF THERE IS AN EOL IN STRING,
			;AND WE DON'T WANT TWO EOL'S PRINTED.
			;THE FOLLOWING INPUTS A FIELD (IE TO A
			;NON-ALPHANUMERIC CHARACTER), EDITS,
			;AND IF INPUT WAS "?",
			;TYPES GIVEN MESSAGE AND INPUTS AGAIN.
			;"%Z" IN MESSAGE EXPANDS TO ALL
			;KEYWORDS IN TABLE.

	MOVEI A,CTBL1		;COMMAND TABLE ADDRESS FOR %Z
	INHELP <
Commands are:
%1Z
 Subsystem name
 Save file name
 Number/
 Number\ number
 ; Comment

>
	CAIG CNT,1		;IS FIELD COUNT (INCL. TERMINATOR) > 1?
	JRST CIN1A		;NO, COMMAND BEGINS WITH SPECIAL CHAR
	MOVE B,.BFP		;BYTE PTR TO BEGINNING OF FIELD
	HRREI D,-1(CNT)
CIN0A:	ILDB A,B		;GET CHARACTER OF FIELD
	MOVE C,CHRTBL(A)	;GET INFO ABOUTSAID CHARACTER
	TRNN C,OCTDIG		;TEST OCTAL DIGIT BIT
	JRST CIN1C		;COMMAND MUST BEGIN WITH A WORD
	SOJG D,CIN0A		;CHECK ALL CHARACTERS OF FIELD
	JRST CIN6		;COMMAND BEGINS WITH AN OCTAL NUMBER
;CIN1A CIN1C

;HANDLE CASES WHERE A NON-ALPHANUMERIC CHARACTER BEGINS COMMAND

CIN1A:	TLZE Z,EOLNEF
	PRINT EOL		;IF THE CHARACTER WAS EOL, NOW ECHO IT
	CALL PASCOM		;IF LINE IS JUST A COMMENT, CHEW IT UP.
	TRNE CBT,TEOL		;EOL, SEMICOLON, OR FORMFEED?
	JRST CMDIN4		;YES, NULL LINE, GO GET ANOTHER LINE.
        CAIN TRM,CTRLE		;↑E PREFIXES PRIVILEGED COMMANDS
	JRST [	SKIPN PRVENF	;ARE PRIV COMMANDS ENABLED?
		 JRST CERR	;NO
                KEYWD CTBL2     ;SEARCH SPECIAL TABLE
		 0		;NO DEFAULT
		 JRST CERR	;NOT FOUND
		JRST CIN2]	;WIN
		;OTHER SPECIAL CHARACTERS TO IMPLEMENT LATER ←←←←←←←←←←←
		;  \ = .\
		;  LF = .+1/
		;  ↑ = .-1/
		;  . = CURRENT LOCATION (\ OR / CAN FOLLOW)
	CAIN TRM,"<"		;BEGIN DIR NAME FOR "RUN"?
	JRST CIN3C		;YES.

;HAVEN'T RECOGNIZED IT YET.
;THIS SHOULD FALL THRU TO WORD CASE RATHER THAN ERROR OUT IF
;  NULL IS TO BE DEFAULTED TO SOME COMMAND SUCH AS "HELP".
	JRST CERR		;TYPE " ?" AND INPUT NEXT COMMAND.

;COMMAND BEGINS WITH A WORD.
;SEARCH COMMAND TABLE, THEN SUBSYSTEM DIRECTORY,
;THEN GO TO USER'S ERROR ROUTINE.

CIN1C:	CAIE TRM,"."		;PERIOD TERMINATOR PRODUCES ERROR IN
	CAIN TRM,"F"-100	; "KEYWD", (CONTROL-F ALSO),
	JRST CIN3		;BUT IS MEANINGFUL IN SUBSYSTEM NAMES.
	TLO Z,BAKFF+NEOLF	;SAY RE-USE THIS FIELD, DON'T ECHO EOL
	KEYWD CTBL1		;SEARCH TABLE OF REGULAR COMMANDS
	 0			;T HELP,NOLOG+NOCONF+ONEWD
				;COULD DEFAULT TO "HELP"
	JRST [SKIPLE CUSRNO	;LOGGED IN?
		 JRST CIN3		;NOT FOUND, GO LOOK FOR SUBSYSTEM NAME.
		JRST .LOGIN]
	;FOUND, FALL INTO CIN2.
;CIN2 CIN2B

;HAVE VALID FIRST KEYWORD IN COMMAND
;OR HAVE DECODED A SPECIAL SYNTAX SUCH AS "<OCTAL #>/".
;VALUE WORD FROM TABLE IS IN AC "KWV".
;MAKE PRE-DISPATCH CHECKS

CIN2:	TLZE Z,EOLNEF
	PRINT EOL		;IF IT ENDED IN UNECHOED CR, NOW ECHO IT
				;ABOVE IS NEEDED DESPITE THE FACT
				;THAT "CONF" DOES IT FOR
				;MULTILINE COMMANDS SUCH AS "LOGIN"
	MOVE KWV1,KWV      	;1ST KW'S VALUE WD STAYS IN KWV1.
	TLNE KWV1,NOLOG
	JRST .+3
	SKIPG CUSRNO		;SKIP IF LOGGED IN
	ERROR <Login please>
	TLNE KWV1,EASUB		;DOES CMND EXAMINE, ALTER, OR RUN PROG?
	JRST [	SKIPN PRVENF	;YES, PRIVILEGES ENABLED?
		SKIPN PROPSF	;NO, PROPRIETARY PROGRAM?
		JRST .+1	;OK
		JRST CERR]	;UNAUTHORIZED MEDDLING
	TLNE KWV1,ONEWD 	;IS IT A ONE-WORD COMMAND?
        CONFIRM         	;YES, HANDLE CONFIRMATION NOW.

;DISPATCH TO ROUTINE TO DECODE REST OF (NON-ONE-WORD) COMMAND THEN
;EXECUTE COMMAND.
;IF "INFILN" BIT WAS ON, JFN IS STILL IN A, AS WELL AS "CJFN1".

CIN2B:  CALL (KWV1)		;DISPATCH WITH PUSHJ,
				;CAN RETURN WITH POPJ
				;OR JRST CMDIN2,3,4.
	JRST CMDIN4		;WHERE MOST COMMANDS SHOULD RETURN.
;CIN3 CIN3C CIN3B CIN3A

;FIRST KEYWORD IS NOT A COMMAND NAME,
; SEE IF ITS A SUBSYSTEM NAME
;ALSO GET HERE ON OCTAL NUMBER NOT FOLLOWED BY /, \, ETC.

CIN3:	TLOA Z,BAKFF+NEOLF+F3	;SAY REUSE FIELD, DON'T ECHO EOL
				;F3 SAYS TO TRY CONN AND LOGIN
				; AFTER SUBSYS
;DIRECTORY SPECIFIED (OPEN ANGLE BRKT. SEEN).  SEARCH ONLY IT.
CIN3C:	TLO Z,BAKFF+NEOLF

	MOVE A,[B0,,400000]
	MOVE B,PTTYMD+6		;INTERRUPT MASK
	MOVE C,PTTYMD+7		;DEFERRED INTERRUPTS
	STIW			;SET THEM
				;ERROR WILL UNSET THEM IN UNKNOWN NAME
	MOVEI A,[ASCIZ /SUBSYS/]	;DEFAULT DIRECTORY NAME
	CALL CPFN		;COLLECT PROGRAM FILE NAME
	 JRST CIN5		;NOT A SUBSYSTEM NAME
	 JRST CIN3B
	 JRST CIN3A
CIN3B:	SKIPG CUSRNO		;SKIP IF LOGGED IN
	ERROR <Login please>
CIN3A:		;NOTE: KWV1 WAS SET TO 0 ABOVE. 0 IS OK HERE.
	MOVE A,CJFN1		;FILE TO "RUN"
	MOVE B,[1,,FDBCTL]	;CONTROL WORD
	MOVEI C,C		;TO C
	CALL $GTFDB		;GTFDB OR DON'T SKIP
	 JRST CERR		;DOESN'T EXIST FOR THIS USER
	CAIE TRM,33		;MUST CONFIRM IF ALTMODE USED
	TLO KWV1,PROGX		;SAY WE'RE PASSING CONTROL TO PROGRAM
	TLNE C,(FDBEPH)		;IS THE FILE AN EPHEMERON?
	 JRST CIN4		;YES, TO HANDLE AS SUCH
	PUSH P,[..STRT]		;SET RETURN TO JOIN "START" COMMAND
	JRST GET1		;AND JOIN "GET" COMMAND
;CIN4 CIN4A CIN40 CIN41 CIN42 CIN43 CIN44 CIN45

;RUN AN EPHEMERAL SUBSYSTEM
; THIS IS TO BEHAVE AS AN EXTENTION TO THE EXEC, THEREFORE:
; IT RUNS WITH THE EXEC'S TTY MODES IN EFFECT, AND
; IF THE TERMINATOR WAS SOMETHING THAT CAN BE INTERPRETED
;  AS THE BEGINNING OF A FILE NAME, THE INPUT FILE WILL BE
;  BACKED SO THAT THE EPHEMERON CAN GOBBLE IT.
; EFORK IS -1 OR FORK HANDLE IN WHICH THE EPHEMERON IS RUNNING.
;  THIS IS CHECKED IN ↑C AND ERROR ROUTINES FOR APPROPRIATE ACTION.
;  NOTE THAT THESE CONDITIONS ARE HANDLED EXACTLY THE SAME AS
;  IF THEY HAD OCCURRED DURING AN EXEC COMMAND.

CIN4:	NOISE <;E>
CIN4A:	CONFIRM
	SETZ B,			;USE ENTRY VECTOR INDEX 0


;ENTER HERE FROM PLACES LIKE "ARCHIVE DELETE ..."

CIN40:	PUSH P,B		;EV INDEX IN B
	CONFIRM
	SETOM 1
	CALL MAPPF		;FLUSH ANY MAPPED PAGE

CIN41:	INTOFF
	MOVEI 1,-1		;NO CAPS., NONSENSE PC
	CFORK
	 JRST [	INTON
		UERR [ASCIZ /No forks available -- try again/]]
	MOVEM 1,EFORK		;SAY WE HAVE AN EPHEMERAL FORK
	MOVE 2,[777000,,777777]	;CAPABILITIES TO TRANSMIT
	SKIPE 3,PRVENF		;IF ENABLED IN THIS EXEC,
	MOVE 3,2		;ENABLE THE EPHEMERON
	EPCAP

CIN42:	PUSH P,SUBSYS		;SAVE OLD SUBSYS NAME
	MOVE B,CJFN1		;FILE TO RUN
	CALL SUBNAM		;SETUP LOCATION SUBSYS
	MOVE 1,SUBSYS
	SETNM
	POP P,SUBSYS		;FOR WHEN WE RUN NORMAL FORK AGAIN

CIN43:	INTON
	MOVEI 1,GETILI		;SET SPECIAL ILLEGAL INSTR DISPATCH
	MOVEM 1,ILIDSP		;IN CASE GET ITRAPS
	HRR 1,CJFN1
	HRL 1,EFORK
	GET
	SETZM ILIDSP		;NO LONGER INTERESTED IN ILL INSTRS
	CALL RLJFNS		;FLUSH ANY JFNS THAT ARE HANGING AROUND

CIN44:	MOVE 1,EFORK
	GEVEC
	HLRE 3,2
	JUMPE 3,.+4
	CAIL 3,1000
	CAIN 3,(JRST)
	CAIA
	 ERROR <Not runnable>
	POP P,3			;GET EV INDEX
	ADD 2,3			;COMPUTE START LOCATION
	TLZ 2,-1
	SFORK

CIN45:	WFORK			;↑C AND ERRORS HAPPEN HERE
	INTOFF
	MOVE 1,EFORK
	FFORK
	MOVE 2,[CALL CUUO]
	MOVEM 2,41		;REALLY NEEDED?
	RFSTS			;FIND OUT WHY IT TERMINATED
	TLZ 1,(1B0)		;FLUSH FROZEN BIT
	CAMN 1,[2,,0]		;VOLUNTARY TERMINATION
	 JRST [	MOVE 1,EFORK
		KFORK
		SETOM EFORK
		INTON
		JRST CMDIN2]	;RETURN TO COMMAND INPUT
	TLNE 1,077700		;LOOK FOR -1 INSTEAD OF FORK HANDLE
	 JRST [	SETOM EFORK	;SAY IT HAS GONE
		INTON
		UERR [ASCIZ /Ephemeron killed itself/]];WIERD
	PUSH P,A
	INTON
	POP P,A
	PRINT EOL
	TYPE < During ephemeron:>
	JRST INVOLT		;AFTER "WAIT" IN X1CMD
;CIN5

;NOT A SUBSYSTEM NAME,
; GO TO SPECIAL ERROR PROCESSOR IF THIS USER HAS ONE
;4/30/70: AT THIS POINT WE DON'T KNOW THE WHOLE INPUT TEXT
;	BECAUSE WE HAVEN'T CAPTURED CHARACTERS READ BY GTJFN.

CIN5:	;BRANCH TO PROCESSOR IF ANY
	;(NOT IMPLEMENTED YET)
	JRST CERR		;STANDARD ERROR PROCESSING, "?" TEXT.
;CIN6

;COMMAND BEGINS WITH OCTAL NUMBER

CIN6:	CAIE TRM,"."		;IF IT ENDS WITH ".", OR
	TRNE CBT,TEOL+TSPC+TALT	;IF IT ENDS WITH EOL, SPACE, OR ALTMODE,
	JRST CIN3		;TAKE AS A SUBSYSTEM NAME.

;DECODE SPECIAL SYNTAXES FOR / AND \ COMMANDS.
	TLO Z,BAKFF		;UN-INPUT THIS FIELD
	CALL OCTAL		;INPUT 18-BIT OCTAL NUMBER
	 CALL SCREWUP		;NULL INPUT CAN'T OCCUR
	PUSH P,A		;SAVE VALUE OBTAINED
;THE TERMINATOR OF THE OCTAL NUMBER IDENTIFIES THE COMMAND.
;GET A DUMMY "TABLE VALUE WORD" APPROPRIATE FOR THE COMMAND AND
; GO THROUGH THE REGULAR CHECK AND DISPATCH CODE TO CHECK FOR
; NOT LOGGED IN, PROPRIETARY PROGRAM, ETC.
	MOVE KWV,[EASUB,,CSLSH]
	CAIN TRM,"/"
	JRST CIN2
	MOVE KWV,[EASUB+ALTCON,,CBKSL]
	CAIN TRM,"\"
	JRST CIN2
	JRST CERR
;NOTE: "CIN2" DISPATCHES WITH PUSHJ, SO WHEN COMMAND ROUTINE IS
;ENTERED, THE VALUE SAVED ABOVE IS AT -1(P), NOT 0(P).
;CSLSH

;EXECUTE "/" COMMAND (EXAMINE)
;DECODING AND CHECKS ARE COMPLETE, CONFIRMATION ISN'T USED.

CSLSH:	MOVE A,-1(P)		;ADDRESS
	CALL MAPPF		;MAP THAT PAGE & GET ACCESS INFO
	TLNN A,B5
	ERROR <No such page>
	TLNN A,B2
	ERROR <Can't read that page>
	MOVE A,-1(P)		;GET ADDRESS AGAIN
	MOVEM A,DOT		;UPDATE CURRENT LOCATION
	ANDI A,777		;GET REL ADDRESS IN PAGE
	PRINT TAB		;OUTPUT A TAB
	HLRZ B,PAGEN(A)		;LH OF WORD IN PAGE BUFFER
	JUMPE B,.+3		;LH NON-0?
	CALL TOCT		;YES, TYPE IT IN OCTAL
	TYPE <,,>
	HRRZ B,PAGEN(A)		;RH
	CALL TOCT		;TYPE IT
	PRINT EOL		;TYPE CARRIAGE RETURN
	JRST CMDIN4		;DONE, GET NEXT COMMAND
;CBKSL CBKSL1 CBKSL5

;FINISH DECODING AND EXECUTE "\" COMMAND (DEPOSIT)
;SYNTAX IS <ADDR>\<VALUE>
;       OR <ADDR>\<LH><SPACE, TAB, ALT MODE, COMMA, OR 2 COMMAS><RH>

CBKSL:	SKIPL FORK		;FORK EXISTS?
	JRST CBKSL1		;YES
	CALL ECFORK		;NO, CREATE ONE
CBKSL1:	MOVE A,-1(P)		;NOTE: COMMAND RETURN ADDRESS IS AT 0(P)
	CALL MAPPF		;MAP THAT PAGE AND GET ACCESS INFO
	MOVEM A,-1(P)		;SAVE ACCESS INFO WITH ADDRESS
	TLNN A,B5
	JRST [	UTYPE [ASCIZ / [New] /] ;ADVISORY MESSAGE
		JRST .+3]		;DON'T TEST WRITE BIT HERE!
	TLNN A,B3
	JRST [	TLNN A,B9		;COPY-ON-WRITE BIT
		UERR [ASCIZ /Can't write that page/]
		UTYPE [ASCIZ / [Shared] /]
		JRST .+1]
;GET VALUE
	CALL OCTCOM		;INPUT VALUE, ACCEPTING LH,,RH ETC,
	 JRST CERR		;R1: NULL.   ...AND CHECKS TERMINATOR.
	CONFIRM
	MOVE B,-1(P)
	HRRZM B,DOT		;UPDATE CURRENT LOCATION

;STORE A AT B IN FORK. ASSUME WE STILL HAVE THE PAGE.

CBKSL5:	ANDI B,777		;MASK OFF PAGE # PART OF ADDRESS
	MOVEM A,PAGEN(B)	;STORE INTO PAGE BUFFER

;EXECUTION OF "\"...
;IF ADDRESS < 20, SET FORK AC'S. NON-AC PAGES HANDLE THEMSELVES.
	MOVE C,DOT
	CAILE C,17
	JRST CMDIN4
	MOVE A,FORK
	MOVEI B,PAGEN
	CAIGE C,20
	SFACS
	JRST CMDIN4
;ALOTST ALOFRK ALF1 ALF2 ALF3

;SUBROUTINE TO "AUTOLOGOUT" THIS JOB IF NOT LOGGED IN AND MORE
; THAN "AUTOL1" SECONDS HAVE ELAPSED SINCE STARTUP.
;ONE CALL IN CMDIN4 AREA.

ALOTST:	PUSH P,A
	GTAD
	SUB A,STRTIM
	SUBI A,AUTOL1
	JUMPG A,AUTOLO		;DO AUTOLOGOUT (XSUBRS.MAC)
	POP P,A
	RET

;ROUTINE FOR FORK TO AUTO-LOGOUT ABANDONED JOBS.
;IF NO TTY ACTIVITY FOR N SECONDS, LOGOUT, ELSE REPEAT, UNTIL LOGGED IN.
;THIS FORK IS KILLED IN "LOGIN" CODE AND "ERRET" CODE
; IN MAIN FORK.

ALOFRK:	MOVEI A,AUTOL2*↑D1000	;NUMBER OF SECONDS TO WAIT BEFORE
	DISMS			;...DOING ANYTHING HERE
;LOOP TO LOOK FOR INACTIVE TTY

ALF1:
ALF2:	MOVE C,TTYACF		;AOS'D FOR EVERY CHAR IN/OUT
	MOVEI A,AUTOL3*↑D1000	;NUMBER OF SECS DURING WHICH THERE
	DISMS			;... MUST BE NO ACTIVITY
	CAME C,TTYACF		;HAVE ANY CHARS BEEN TRANSFERRED?
	JRST ALF1		;YES, WAIT AND CHECK AGAIN
ALF3:	SETZM STRTIM		;CAUSES AUTOLOGOUT AT COMMAND INPUT IF
				;AN ERROR OR ↑C PREVENTS IT FROM
				;COMPLETING AFTER PSI.
	MOVEI A,-1		;MAIN EXEC FORK,
	HRLZI B,B2		;CHANNEL 2
	IIC			;GOOSE TO SAY AUTOLOGOUT NEEDED
	HALTF
;READ ONLY STORAGE AREA

;COMMAND TABLES

;FORM:
;       LABEL:  NUMBER OF ENTRIES
;               [VALUE],,[ASCIZ @TEXT@]  FOR EACH ENTRY, ALPH ORDER
;   VALUE IS GENERALLY  BITS,,ADDRESS
;       SEE "DEFINITIONS" FILE FOR BIT SYMBOLS AND MACRO DEFINITIONS

;MACROS USED TO GENERATE TABLES (DEFINED IN "DEFINITIONS" FILE)
;
;	T TEXT[,BITS[,ADDRESS]]		;HERE []'S MEAN OPTIONAL
;		SETS UP ENTRY. DEFAULTS ADDRESS TO ".TEXT", OR IF
;		THAT IS UNDEFINED, TO "NOT IMPLEMENTED" ERROR ROUTINE
;
;	X TEXT
;		CREATES A SPECIAL FAKE ENTRY, TO MAKE AN OTHERWISE
;		UNIQUE SUBSET AMBIGUOUS (EVEN THE EXACT TEXT GIVEN TO X 
;		MACRO WILL BE TREATED AS AMBIGUOUS).  USED WHERE ACTUAL
;		AMBIGUITY IS WITH AN ENTRY IN ANOTHER TABLE SEARCHED
;		LATER.
;
;	TABLE	RESERVES WD FOR # ENTRIES AT TOP OF TABLE
;
;	TEND	FILLS IN # OF ENTRIES SINCE LAST "TABLE" MACRO
;		IN LOCATION RESERVED BY THAT "TABLE" MACRO
;CTBL1

;COMMANDS NOT PREFIXED BY ↑E.
;ALL BUT THOSE WITH "WOEPUO" BIT ARE AVAILABLE TO ANY USER.

CTBL1:  TABLE
	T ACCESS,LPROK!LANOK		;ACCESS (OF FILES)--(TO)--(IS)--
;	T ACCOUNT,LPROK			;ACCOUNT (OF FILE)--(IS)--
;	T ADVISE,LPROK+EOLOK+ALTCON	;ADVISE (USER)
	T APPEND,LANOK+CONMAN+LPROK	;APPEND <FILE> (TO) <FILE>
;	T ARCHIVE			;ARCHIVE
	T ASSIGN,LPROK			;ASSIGN <DEVICE> (AS) <NAME>
	T ATTACH,NOLOG+LPROK+ALTCON	;ATTACH (TO JOB) <JOBNO>
	T AVAILABLE,EOLOK+NOLOG+NOCONF	;AVAILABLE LINES/DEV
;	T BDDT,ONEWD+ALTCON+EASUB	;START BDDT
	T BREAK,NOLOG+EOLOK+LPROK+ALTCON	;BREAK (LINKS)
	T BYE,NOLOG+EOLOK+LPROK+ALTCON,.BREAK	;BREAK (LINKS)
	T CHANGE,LPROK+ALTCON		;CHANGE PASSWORD OR ACCOUNT
	T CLEAR,LPROK+CONMAN		;CLEAR DEVICE DIRECTORY
	T CLOSE,LANOK+LPROK		;CLOSE (FILE) <NAME>
	T COMMANDS,LPROK		;COMMANDS (FROM FILE) <FILE>
	T CON,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /TINUE /] ;CON=CONTINUE
			JRST .CONTI]>	;...DESPITE CONNECT
	T CONNECT,LPROK			;CONNECT (TO DIRECTORY) <NAME>
	T CONTINUE,EOLOK		;CONTINUE
	T COPY,LANOK+CONMAN+LPROK	;COPY <FILE> (TO) <FILE>
	T DAYTIME,ONEWD+NOLOG+NOCONF	;DAYTIME
	T DDT,ONEWD+ALTCON+EASUB	;START DDT
	T DEASSIGN,LPROK		;DEASSIGN <LDEV/DEVICE>
;	T DEFINE,LANOK+LPROK+INVIS	;DEFINE (NEW FILE)--(AS)--
	T DELETE,LANOK			;DELETE <FILE>
	T DETACH,EOLOK+LPROK+LANOK+ALTCON	;DETACH JOB
	T DI,INVIS+NSPALT+COMOK+EOLOK,<[UALTYP [ASCIZ /RECTORY /]
					JRST .DIREC]>
	T DIRECTORY,COMOK+EOLOK+LANOK+ALTCON 	;DIRECTORY.
	T DIS,NSPALT+EOLOK+INVIS+WOEPUO,<[UALTYP [ASCIZ /ABLE /]
			JRST .DISAB]>	;DIS=DISABLE, NOT AMBIG.
	T DISABLE,WOEPUO+ONEWD+ALTCON+INVIS	;DISABLE PRIV CMNDS
	T DISCUSE,ONEWD+NOCONF+NOLOG	;AMOUNT OF DISC AVAILABLE
	T DSKSTAT,ONEWD+NOCONF		;DISK STATUS
;	T DUMP,LANOK+CONMAN+LPROK+INVIS	;DUMP (ON) <FILE>
	T EDIT,LANOK+EOLOK+ALTCON	;EDIT <FILE>
	T ENABLE,WOEPUO+ERRUO+ONEWD+INVIS	;ENABLE PRIV CMDS
	T ENTRY,LPROK			;SET ENTRY VECTOR
	T EPHEMERAL,LANOK		;MARK AS AN EPHEMERON
	T ERRSTAT,ONEWD+NOCONF		;ERROR STATUS
	T ERUN,LANOK+LPROK		;RUN PROGRAM AS AN EPHEMERON
	T EXEC,EOLOK+ONEWD		;EXEC (RUN SEPARATELY FROM FORK)
	T EXPUNGE,LPROK+EOLOK		;EXPUNGE (DELETED FILES)
	T F,INVIS+NSPALT+NOLOG+EOLOK,<[UALTYP [ASCIZ/INGER /]
			JRST .FINGE]>	;F=FINGER
	T FILSTAT,NOCONF+ONEWD		;FILE STATUS
	T FINGER,NOLOG+EOLOK+ALTCON	;FINGER
	T FORK;				;FORK <N>. AFFECTS /, \, ETC.
	T FORMFEED,NOLOG+ALTCON+ONEWD	;SAYS TTY HAS FORMFEED
;	X FU				;REQUIRE 3 CHARS FOR FULLDUPLEX
	T FULLDUPLEX,NOLOG+ONEWD+ALTCON	;SAYS TTY IS FULL DUPLEX
	T GET,LANOK+LPROK		;GET <FILE>
	T GOTO,EASUB+LPROK		;GOTO <OCTAL>
;	T HAL,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /FDUPLEX /]
;					JRST .HALFD]>	;AVOID HALT
	T HALFDUPLEX,NOLOG+ONEWD+ALTCON
;	T HALT,INVIS+EOLOK+COMOK	;HALT THE SYSTEM
	T IDDT,ONEWD+ALTCON+EASUB	;START AN IDDT
	T IMPSTAT,NOLOG+NOCONF+ONEWD	;TYPE STATUS OF IMP
	T INDICATE,NOLOG+EOLOK+LPROK	;INDICATE (FORMFEED)
;	T INTERROGATE,LPROK+EOLOK+LANOK+ALTCON	;CHECK ARCHIVE
	T JFNCLOSE,LPROK		;JFNCLOSE <JFN>
	T JOBSTAT,ONEWD+NOCONF		;JOB STATUS
	T K,INVIS+EOLOK+NOLOG,.LOGOU	;LOGOUT (DON'T CONFLICT WITH KK)
	T KJOB,EOLOK+NOLOG,.LOGOU	;LOGOUT
	T KKJOB,EOLOK+NOLOG		;VERY FAST LOGOUT
	T LENGTH,NOLOG+LPROK,.LLENG	;LENGTH (OF PAGE IS)
;	T LIMIT,LPROK+ALTCON+INVIS	;LIMIT (ADDITIONAL)--(TO)--
	T LINK,NOLOG+LPROK		;LINK (TO)
;	X LIS				;BECAUSE OF "LISP"
	T LIST,LANOK+ALTCON		;LIST <FILE>. TAKES SUBCOMMANDS.
	T LOG,NOLOG+NSPALT+EOLOK+LPROK+INVIS+ALTCON,<[SKIPG CUSRNO
					JRST [UALTYP[ASCIZ/IN /]
						JRST .LOGIN]	;FUDGE TO RECOG "LOG" AS "LOGIN"
					UALTYP [ASCIZ /OUT /]
						JRST .LOGOU]>
	T LOGIN,NOLOG+EOLOK+LPROK+ALTCON ;LOGIN <USER> <PASSWD> <ACCT>
	T LOGOUT,EOLOK+NOLOG		;LOGOUT
	T LOWERCASE,NOLOG+ONEWD+ALTCON	;SAYS TTY HAS LOWER CASE
	T MAIL,NOLOG
	T MEMSTAT,ONEWD+NOCONF+EASUB	;MEMORY STATUS
	T MERGE,LANOK+EASUB		;MERGE <FILE>
	T MOUNT				;MOUNT <DEVICE>
	X N
IFN DST10X,<	T NETLOAD,ONEWD+NOCONF+NOLOG	;PRINT NETWORK LOAD AVS>
	T NO,NOLOG+ALTCON		;NO TABS/FORMFEED/LOWERCASE
	T NOT,ALTCON			;NOT EPHEMERAL
	T NUMBER,LPROK!NOCONF		;NUMBER (OF DIRECTORY) <NAME>
;	T PERPETUAL,LPROK+LANOK+ALTCON	;"PERPETUAL <FILE>"
	T PISTAT,ONEWD+NOCONF		;PISTAT
	T PRINT,LANOK+CONMAN+LPROK	;PRINT <FILE GROUP> (ON LPT:)
;	T PRINTER,,.PRNTR		;"PRINTER CHECK/WATCH"
	T PROTECTION,LPROK		;PROTECTION (OF FILE)--(IS)--
	T QD,COMOK+EOLOK+LANOK+ALTCON	;HPP'S HACK
	T QFD,COMOK+EOLOK+LANOK+ALTCON	;QUICK FILE DESCRIPTION
	T QR,COMOK+EOLOK+LANOK+ALTCON	;HPP'S HACK
	T QSYSTAT,ONEWD+NOCONF+NOLOG	;QUICK SYSTAT HACK FOR MGM
	T QUIT,EOLOK+ONEWD		;QUIT: EXIT TO SUPERIOR EXEC
	T QW,COMOK+EOLOK+LANOK+ALTCON	;HPP'S HACK
	T RAISE,NOLOG+ONEWD+ALTCON	;RAISE L.C. INPUT TO UPPER CASE
	T RECEIVE,EOLOK+LPROK+ALTCON	;RECEIVE (LINKS OR ADVICE)
	T REDIRECT,EOLOK+LPROK+LANOK	;REDIRECT PRIMARY I/O
	T REENTER,EOLOK			;REENTER
	T REFUSE,EOLOK+LPROK+ALTCON	;REFUSE (LINKS OR ADVICE)
	T RENAME,LPROK+LANOK+CONMAN	;RENAME (...) -- (TO BE) --
	T RESET,EOLOK+ONEWD		;RELEASES MEMORY & CLOSES FILES
	T REWIND,LPROK+LANOK		;REWIND <DEVICE>
	T RUN,LANOK+LPROK		;RUN <FILE>. STARTS ENV FILE.
	T RUNSTAT,ONEWD+NOCONF		;RUN STATUS: IO WAIT, ETC.
;	X SA				;"SAIL" MIGHT BE A SUBSYS
	T SAVE,CONMAN+LPROK+LANOK+EASUB ;SAVE ... (ON) <FILE>.
	T SHOW,NOLOG+EOLOK+LPROK	;SHOW (LOWER CASE WITH %)
	T SHUT,LPROK+EOLOK		;SHUT (ALL OPEN FILES)
	T SINK,NOLOG+EOLOK+ALTCON	;SINK
	T SSAVE,CONMAN+LPROK+LANOK+EASUB  ;SHARABLE SAVE
	T ST,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /ART /]
			JRST .START]>	;ST=START DESPITE STAT
	T STA,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /RT /];STA=START
			JRST .START]>
	T START,EOLOK			;START PROGRAM
	T STAT,NSPALT+EOLOK+NOCONF+INVIS,<[UALTYP [ASCIZ /ISTICS /]
			JRST .STATI]>	;"STAT" = "STATISTICS"
	T STATISTICS,EOLOK+NOCONF	;SYSTEM STATISTICS
	T STATUS,ONEWD+NOCONF+INVIS	;SEE SYSTAT, JOBSTAT, ETC.
	T STOPS,ALTCON			;SET SOFTWARE TAB STOPS
	T SYSTAT,ONEWD+NOCONF+NOLOG	;SYSTEM STATUS PRINTOUT
;	X TA				;REQUIRE 3 CHARACTERS FOR "TABS"
	T TABS,NOLOG+ONEWD+ALTCON	;SAYS TTY HAS HDWE TABS
	T TERMINAL,NOLOG+LPROK		;TERMINAL TYPE IS N
	T TRMSTAT,ONEWD+NOCONF		;TERMINAL STATUS TYPEOUT
	T TTYPE,LANOK+CONMAN+LPROK	;COPY TO TTY:
	T TYPE,LPROK+LANOK+ALTCON	;LIST FILE TO TTY
	T UNDELETE,LPROK+LANOK		;UNDELETE <FILE>
	T UNLOAD,LPROK+LANOK		;UNLOAD <DEVICE>
	T UNMOUNT,LANOK			;UNMOUNT <DEVICE>
	T USESTAT,ONEWD+NOCONF		;TYPES TIME USED, ETC.
	T VERSION,ONEWD+NOCONF		;IN XMAIN.MAC
	T WHERE,LPROK+NOLOG+NOCONF	;WHERE (IS USER) <NAME>
	T WIDTH,NOLOG+LPROK,.LWIDTH	;WIDTH (OF LINE IS)
        TEND
	REPEAT 5,<0>		;ROOM TO BLT TABLE DOWN FOR PATCHING
;CTBL2

;PRIVILEGED COMMANDS PREFIXED WITH ↑E
;ONLY LEGAL FOR PRIV USERS WHO HAVE "ENABLE"D PRIV COMMANDS

CTBL2:  TABLE
;	T ACCOUNT,ONEWD+WHLUO+OPRUO,..ACCO  ;TURNS ON ACCOUNTING
;	T ASSIGN,WHLUO+OPRUO,..ASSI 	;↑EASSIGN <DEVICE>
;	T BROADCAST,ONEWD+WHLUO+OPRUO	;SEND MSG TO ALL TERMINALS
	T CREATE,LPROK+OPRUO+WHLUO	;CREATE/MODIFY DIRECTORY
	T CYCLE,LPROK+OPRUO+WHLUO	;CYCLE THE NETWORK
	T DISK,LPROK+OPRUO+WHLUO,...DSK	;SET PANIC LEVELS
	T EDDT,ONEWD+WHLUO		;GO TO DDT LOOKING AT EXEC
	T HALT,EOLOK+COMOK		;HALT THE SYSTEM  /HGM TYPES THE ↑E
;	T INITIALIZE,WHLUO+OPRUO	;INITIALIZE SOMETHING
;	T K,LPROK+WHLUO,.KFACT		;K (FACTOR) IS ...
	T LOAD,LPROK+WHLUO+OPRUO	;LOAD (EDDT)
	T NETWORK,WHLUO+OPRUO+LPROK+CONMAN	;TURN OFF/ON NETWORK
;	T NOACCOUNT,ONEWD+WHLUO 	;TURNS OFF SYSTEM ACCOUNTING
	T OFFLINE,LPROK+WHLUO+OPRUO	;REMOVE CORE PAGES
	T ONLINE,LPROK+WHLUO+OPRUO	;ADD CORE PAGES
	T PAUSE,LPROK+WHLUO+OPRUO,..PAUS	;DCHKSW CONTROL
	T PERMIT,LPROK+WHLUO+OPRUO	;PERMIT LOGINS
	T PRINT,LPROK+WHLUO+OPRUO,..PRIN	;PRINT DIRECTORY INFORMATION
	T PROCEED,LPROK+WHLUO+OPRUO	;PROCEED AT BUGCHK
	T PROHIBIT,LPROK+WHLUO+OPRUO	;PROHIBIT LOGINS
	T SET,LPROK+WHLUO+OPRUO+CONMAN	;SET DATE AND TIME
	T SYSTEM,LPROK+WHLUO+OPRUO	;DEBUGSW CONTROL
;	T TRAPS,LPROK+WHLUO+OPRUO	;JSYS TRAPS ON/OFF
	T UNLOAD,LPROK+WHLUO+OPRUO,..UNLOA	;UNLOAD (EDDT)
;	T UNHANG,WHLUO+OPRUO		;↑E UNHANG <DEVICE>
	TEND
;CHRTBL

;CHARACTER TABLE

;ONE WORD PER CHARACTER:
;	DESCRIPTIVE BITS IN RIGHT HALF
;	LH: SPECIAL CASE DISPATCH FOR SUBROUTINE "CCHRI" (XSUBRS.MAC).
;WORD FROM "CHRTBL" FOR LAST CHARACTER IS GENERALLY IN THE AC "CBT".

;BITS IN RIGHT HALF (VALUES DEFINED IN FILE "D")
; ALPHAN	ALPHANUMERIC CHARACTERS, - # '
; OCTIG		0-7
; PUNBIT	MOST OTHERS EXCEPT FILE NAME FIELD TERMINATORS
; TEOL		EOL, SEMICOLON, FORMFEED
; TSPC		SPACE, TAB
; TALT		ALT MODE
; TCOM		COMMA
; TLPR		LEFT PAREN
; TRPR		RIGHT PAREN
; TCOL		COLON
; TLAN		LEFT ANGLE BRACKET
; TRAN		RIGHT ANGLE BRACKET

CHRTBL:	0		;NULL
 $CTRLA,,0		;↑A  DELETE CHARACTER
	0		;↑B
	0		;↑C
	0		;↑D
	0		;↑E
	0		;↑F "RECOGNIZE FIELD" FOR FILE NAMES
	0		;↑G
 $CTRLH,,0		;↑H - BACKSPACE -  MAKE IT DELETE A CHAR
	TSPC		;↑I = TAB. TREATED LIKE SPACE.
	0		;↑J = LINE FEED
	0		;↑K
 $FORMF,,TEOL		;↑L FORM FEED
	0		;↑M = CR. CR-LF BECOMES EOL B4 CHRTBL REFERENCE
	0		;↑N
	0		;↑O
	0		;↑P
	0		;↑Q
 $CTRLR,,0		;↑R RETYPE LINE
	0		;↑S
	0		;↑T PRINT RUNTIME PSI CHARACTER
	0		;↑U
 $CTRLV,,0		;↑V QUOTE NEXT CHARACTER
 $CTRLW,,0		;↑W DELETE FIELD
 $CTRLX,,0		;↑X DELETE WHOLE COMMAND
	0		;↑Y
	0		;↑Z MEANS EOF FROM TTY TO COPY CMD
	TALT		;33: ALT MODE
	0
	0
	0
 $EOL,,TEOL		;37: EOL (REPRESENTS CR-LF)
	TSPC		;40: SPACE
	PUNBIT		;!
	PUNBIT		;"
	ALPHAN		;# "ALPHANUMERIC" FOR NOISE WDS, EG "JOB #"
	PUNBIT		;$
	PUNBIT		;%
 $CONT,,PUNBIT		;&: CONTINUE ON NEXT LINE, TREATED AS SPACE
	ALPHAN		;'
	TLPR		;(
	PUNBIT+TRPR	;)
	PUNBIT		;*
	PUNBIT		;+
	TCOM		;,
 $DASH,,ALPHAN		;- "ALPHANUMERIC" BECAUSE ITS FIELD-NULLER
	0		;.
	PUNBIT		;/
REPEAT 10,<ALPHAN+OCTDIG		;0 THRU 7
>
	ALPHAN		;8
	ALPHAN		;9
	TCOL		; : ACCEPTABLE TERMINATOR FOR DEVICE NAMES
	PUNBIT+TEOL	;SEMICOLON: TREAT AS EOL WHEN USED AS TERMINATOR
	TLAN		;<
	PUNBIT		;=
	TRAN		;>
	PUNBIT		;?
	PUNBIT		;100: @
REPEAT ↑D26,<ALPHAN	;A THRU Z = 101 THRU 132
>
	PUNBIT		;[
	PUNBIT		;\
	PUNBIT		;]
	PUNBIT		;↑
	PUNBIT		;←
	0		;140=WHAT?
REPEAT ↑D26,<ALPHAN	;LOWER CASE A-Z = 141-172
>
	0
	0
	0
	0
 $RUB,,0		;177: RUBOUT
IFN .-CHRTBL-200,<PRINTX CHARACTER TABLE SCREWED UP
>
;LEVTAB CHNTAB

;PSEUDO-INTERRUPT SYSTEM TABLES

;LEVEL TABLE: WHERE TO STORE PC'S FOR VARIOUS LEVELS

LEVTAB:	LEV1PC
	LEV2PC
	LEV3PC

;CHANNEL TABLE
;INDEXED BY CHANNEL NUMBER. LEVEL,,ADDRESS FOR EACH.

CHNTAB:	
 0		;0: USED BY MINI-EXEC?
 1,,CCPSI	;1: ASSIGNED BY PROGRAM TO ↑C
 1,,ALOPSI	;2: ASSIGNED BY PROGRAM TO AUTO-LOGOUT
 2,,USEPSI	;3: ASS BY PROG TO CHAR TO PRINT RUNTIME (↑T)
 2,,HUPSI	;4: ASS BY PROG TO DATAPHONE HANGUP
 0
 0		;6: OV, FOV, NODIV, FXU (SHOULDN'T BE ENABLED)
 0
 0
 1,,[UTRAP [ASCIZ /Pushdown overflow/]] ;9: PDL OVERFLOW
 1,,EOFPSI	;10: END OF FILE
 1,,DATPSI	;11: FILE DATA ERROR
 1,,[UTRAP [ASCIZ /File err 3/]]  ;12: "FILE COND 3" (AS YET UNDEF)
 1,,[UTRAP [ASCIZ /File err 4/]]  ;13: "FILE CONDITION 4" ( " " " )
 0		;14: TIME OF DAY.
 1,,ILIPSI	;15-18: I>>, MR>>, MW>>, MX>>
 1,,[UTRAP [ASCIZ /Illegal memory read/]]
 1,,[UTRAP [ASCIZ /Illegal memory write/]]
 1,,[UTRAP [ASCIZ /Illegal memory execute/]]
 0		;19: SUBSIDIARY FORK TERMIATED (SHDN'T BE ON)
 1,,[UTRAP [ASCIZ /System storage capacity exceeded/]]  ;20:DRM,DSK
 REPEAT 3,<0>	;21-23: UNASSIGNED
 REPEAT ↑D12,<0>	;24-35: GENERAL
IFN .-CHNTAB-↑D36,<PRINTX CHNTAB SCREWED UP
>
;SPECIFIC EXEC COMMAND ROUTINES
;THESE ROUTINES ARE DISPATCHED TO BY THE MAIN LOOP, AS DRIVEN
;BY THE TABLES

;THE COMMAND ROUTINES ARE GROUPED AS FOLLOWS:

;  REST OF XMAIN.MAC:
;    STATUS COMMANDS GROUP -- STATUS, JOBSTAT, RUNSTAT, USESTAT,
;	FILSTAT, DSKSTAT, SYSTAT, STATISTICS, ERRSTAT, MEMSTAT.
;    TERMINAL CHARACTERISTICS COMMANDS GROUP -- HALFDUPLEX, FULLDUPLEX,
;	TABS, FORMFEED, LOWERCASE, NO ... , INDICATE.

;  X1CMD.MAC:
;    OTHER COMMANDS, IN ALPHABETICAL ORDER.
;    MOST PRIVILEGED COMMANDS.

;  X2CMD.MAC, X3CMD.MAC, X4CMD.MAC, X5CMD.MAC:
;    SOME COMMANDS WITH LONG ROUTINES, SEGREGATED TO REDUCE
;    NORMAL WORKING PAGE SET:
;	X2CMD.MAC:	COPY, LIST/TYPE, REDIRECT/DETACH
;	X3CMD.MAC:	DIRECTORY,
;	X4CMD.MAC:	CREATE, PRINT
;	X5CMD.MAC:	NETLOAD

;  ABOVE IN XMAIN.MAC:
;    /, \, VERSION
;.STATU .JOBST JOBST0


;STATUS COMMANDS GROUP

;STATUS

.STATU:	TYPE < The status commands available are:
 PISTAT, DISCUSE, IMPSTAT, STATISTICS, ERRSTAT,
 JOBSTAT, RUNSTAT, USESTAT, MEMSTAT, FILSTAT, DSKSTAT, and SYSTAT.
>
	RET

;JOBSTAT

.JOBST:	ETYPE < TSS job %J, user %N%, %L%
>
JOBST0:	RET	;REST REMOVED TILL GFRKS DONE. 5/22/70 ←←←←←←←←←←←←←←
	REPEAT 0, <
;TYPE FORK STRUCTURE
	MOVEI A,400000		;SAY START AT SELF
	MOVEI B,CSBUF		;USE STRING BUFFER
	TLO B,B0		;SAY ASSIGN HANDLES
	GFRKS			;GET FORK STRUCTURE
	HRRZ D,(B)		;POINTER TO FORKS INFERIOR
	SETZ E,			;INITIALIZE LEVEL COUNTER
	;FALL INTO FSTRUC
	;"FSTRUC" MUST BE NEXT
;FSTR1 FSTR2 FSTRUC

;FSTRUC
;RECURSIVE SUBR TO TYPE FORK STRUCTURE OF JOB.
;FOR EACH FORK, TYPES HANDLE AND STATUS.
;  FILE NAME OR "PROGRAM" WOULD ALSO BE DESIRABLE IF IT WERE AVAILABLE.
;STRUCTURE INDICATED BY PUTTING A FORK'S INFERIORS RIGHT AFTER IT,
;  INDENTING 3 COLUMNS PER LEVEL.
;THUS PARELLEL FORKS ARE THOSE WHICH APPEAR AT SAME INDENTATION WITH
;  NO LESS-INDENTED ENTRIES BETWEEN THEM.
;TAKES: D: POINTER TO GFRKS TABLE, SET UP BY CALLER.
;	E: LEVEL COUNTER, ZEROED BY TOP LEVEL CALLER.

;ENTRY POINT IS AT END BUT COMES RIGHT HERE.
;TYPE STUFF FOR THIS FORK.

FSTR1:	PRINT " "
	MOVE A,E
	TYPE <   >;		;INDENT 3 SPACES PER LEVEL BELOW FIRST.
	SOJGE A,.-1
	TYPE <FORK >;
	HRRZ B,1(D)		;GET THIS FORK'S HANDLE FROM TABLE
	JUMPE B,[UTYPE [ASCIZ /**/]		;NO HANDLE ASSIGNED
		JRST FSTR2]
	TRZ B,B0		;PRINT IN FORM ## NOT 4000##
	MOVE A,COJFN
	MOVEI C,10
	NOUT			;FORK HANDLE, OCTAL
	 CALL JERRC		;JSYS ERROR ROUTINE FOR ERROR NUM IN C
FSTR2:	TYPE <: >;
	HRRZ A,1(D)		;HANDLE AGAIN
	CALL FSTAT		;TYPE ITS STATUS
	PRINT EOL
;NOW DO ALL OF THE FORK'S INFERIORS, BY RECURSION.
	PUSH P,D
	HRRZ D,(D)		;INFERIOR PTR FROM GFRKS TABLE.
	AOS E			;DOWN LEVEL
	CALL FSTRUC		;RECURSIVE CALL TO DO ENTIRE SUBTREE
	SOS E			;UP LEVEL
	POP P,D
	HLRZ D,(D)		;PARALLEL PTR FROM GFRKS TABLE

;ENTRY POINT.  NOP IF 0 PTR GIVEN.
FSTRUC:	JUMPN D,FSTR1
	RET
>
;.RUNST RUNST8 LAPRNT

;RUNSTAT

.RUNST:	PRINT " "
	SKIPGE FORK
	JRST [	UTYPE [ASCIZ /No program/]
		JRST RUNST8]
	SKIPGE A,LRFORK
	JRST [	UTYPE [ASCIZ /Never started/]
		JRST RUNST8]
	ETYPE <%F%>	;TYPE "FORK N" IF THIS EXEC HAS >1 INFERIOR
	CALL FSTAT		;TYPE STATUS OF THE FORK
RUNST8:	PRINT EOL
	CALL LAPRNT		;PRINT THE LOAD AVERAGE
	JRST EOLRET


;SUBROUTINE TO PRINT THE LOAD AVERAGE.
;USED BY ↑T INTERRUPT AND BY RUNSTAT

LAPRNT:	MOVE A,['SYSTAT']
	CALL $SYSGT
	JUMPN B,.+2
	CALL SCREWUP		;NO SUCH TABLE??
	MOVSI A,14		;INDEX OF 1 MIN. AV.
	HRR A,B			;TABLE PTR
	GETAB
	 CALL SCREWUP
	ETYPE < Load av = %1Q>
	RET
;FSTAT FSTAT4 FSTAT8 FSTAT9

;FORK STATUS TYPEOUT SUBR FOR "RUNSTAT" AND "JOBSTAT".
;TAKES HANDLE IN A, CLOBBERS A.
;USED IN FSTRUC (JOBSTAT), RUNSTAT, ↑T PSI ROUTINE (XSUBRS.MAC)

FSTAT:	PUSH P,B
	PUSH P,C
	PUSH P,D
	RFSTS			;GET STATUS IN A, PC IN B
	HLRZ C,A		;B1-17 = STATUS
	CAIN C,-1		; -1 = UNASSIGNED HANDLE. (OR SUPERIOR?)
	JRST [	MOVEI D,[ASCIZ /Program disappeared/]; ..KILLED PROGRAM
		JRST FSTAT8]
	TRZ C,B0		;FLUSH FROZEN BIT
	CAIN C,6		;BREAKPOINT?
	JRST FSTAT4		;YES
	CAIE C,2		;HALT OR FORCED TERM?
	CAIN C,3
FSTAT4:	TLZ A,B0		;YES, WASN'T RESULT OF ↑C
	JUMPL A,[UTYPE [ASCIZ /Interrupted from /]	;"FROZEN" BIT ON
		JRST .+1]		;TYPE STATUS AND PC
	UTYPE @[[ASCIZ /running/]
		[ASCIZ \I/O wait\]
		[ASCIZ /halt/]		;INCLUDES NEVER STARTED
		[ASCIZ /halt: /]
		[ASCIZ /fork wait/]
		[ASCIZ /sleep/]
		[ASCIZ /breakpoint/]](C)	;NOTE INDEX!
	MOVEI D,[ASCIZ / at %2P/]	;%2P TYPES PC FROM B
	CAIE C,3
	JRST FSTAT8		;GO OUTPUT "AT <PC>"
				;AFTER ERROR STOP, TYPE REASON AS GIVEN
				;BY PSI CHAN # IN RH OF A.  USE TEXT
				;FROM "START" COMMAND'S ERROR MSG TAB.
	MOVE D,@WHY		;SEE "START". USES A.
FSTAT8:	UETYPE (D)		;TYPE MSG. INCLUDES PC FROM B.
FSTAT9:	POP P,D
	POP P,C
	POP P,B
	RET
;.PISTA Job TIW

;PISTAT
;PSI IS OFF, LEVTAB=NNNNNN, CHNTAB=NNNNNN, CHN MASK=NNNNNNNNNNNN, BIP=N

.PISTA:	CALL CRIF
	SKIPGE 1,FORK
	JRST [	UTYPE [ASCIZ /No program/]
		JRST EOLRET]
	UTYPE [ASCIZ /PSI is /]
	MOVEI 5,[ASCIZ /on/]
	SKPIR
	MOVEI 5,[ASCIZ /off/]
	UTYPE 0(5)
	RIR
	HLRZ 4,2		;LEVTAB
	HRRZ 5,2		;CHNTAB
	RCM
	MOVE 6,1		;CHN MASK
	MOVE 1,FORK
	RWM
	MOVE 7,1		;BREAKS WAITING
	MOVE 10,2		;BREAKS IN PROGRESS
	AND 10,[17B3]
	MOVE 1,FORK
	RTIW
	MOVE 11,2		;USER TIW
	MOVNI 1,5
	RTIW
	MOVE 12,2		;JOB TIW
	ETYPE <, LEVTAB at %4O, CHNTAB at %5O
 Channels active:	%6U
 Breaks waiting:	%7U
 Levels in progress:	%10U

 Fork TIW:	%11O
 Job TIW:	%12O>
	RET
;.IMPST IMPST0 IMPST1 IMPST2 IMPST3 IMPST4 IMPS45 IMPST5 IMPST6 IMPSTX

; "IMPSTAT"

.IMPST:	MOVE A,['NETRDY']
	CALL READT		;READ INTO 4, 5, ...
	SUBI C,4		;NEW SYSTEMS HAVE LENGTH .GT. 4
	PUSH P,C		;NEW SYSTEM FLAG
	PUSH P,13		;NETRDY[7]: TIME OF IMP-GOING-DOWN MSG
	PUSH P,12		;NETRDY[6]: TIME OF READY LINE ON
	PUSH P,11		;NETRDY[5]: TIME OF READY LINE OFF
	PUSH P,10		;NETRDY[4]: IMP-GOING-DOWN HEADER
	PUSH P,7		;NETRDY[3]: TIME OF LAST NCP RESET
	PUSH P,6		;NETRDY[2]: NCP FLAGS (N.A.)
	PUSH P,5		;NETRDY[1]: NETON
	PUSH P,4		;NETRDY[0]: IMPRDY
	MOVE 1,COJFN		;NEEDED FOR ODTIM'S BELOW

IMPST0:	CALL CRIF		;TYPE CARRIAGE RETURN IF NEEDED
	TYPE <Host-IMP interface is >
	SKIPN 0(P)
	 TYPE <off>
	SKIPE 0(P)
	 TYPE <on>

IMPST1:	CALL CRIF
	TYPE <Tenex-network service is >
	SKIPN -1(P)		;NETRDY[1] SAYS WHICH
	 TYPE <disabled>
	SKIPE -1(P)
	 TYPE <enabled>

IMPST2:	SKIPG -8(P)		;NEW SYSTEM?
	 JRST IMPSTX		;NO

IMPST3:	SKIPN -1(P)		;NCP RESET RELEVANT ONLY IF NETON
	 JRST IMPST4		;NOT AVAILABLE
	CALL CRIF
	SKIPG 2,-3(P)		;NETRDY[3] HAS LAST NCP RESET
	 TYPE <Tenex has not reset network tables since last restarted>
	JUMPLE 2,IMPST4		;0 IS AMBIGUOUS
	TYPE <Tenex reset network tables at >
	SETZ 3,			;STANDARD FORMAT
	ODTIM

IMPST4:	SKIPN 2,-7(P)		;GTAD OF IMP-GOING-DOWN MSG ARRIVAL
	 JRST IMPST5		;NONE HAS ARRIVED
	CALL CRIF
	SKIPG 2
	 TYPE <While Tenex was restarting the IMP said it would go down
	>
	 JUMPL 2,IMPS45		;-1 MEANS SYSTEM DIDN'T HAVE TIME
	TYPE <At >
	SETZ 3,			;STANDARD FORMAT
	ODTIM
	TYPE < the IMP said it would go down at >
	MOVE 1,2
	LDB 2,[POINT 4,-4(P),21];HOW SOON IN 5 MIN. UNITS
	IMULI 2,5
	CALL TIMPMN		;GTAD IN 1 PLUS MINUTES IN 2
	MOVE 2,1		;SET FOR ODTIM
	MOVE 1,COJFN
	SETZ 3,			;STANDARD FORMAT
	ODTIM

IMPS45:	TYPE < for >
	LDB 2,[POINT 10,-4(P),31];HOW LONG IN 5 MIN. UNITS
	IMULI 2,5
	MOVEI 3,↑D10
	NOUT
	 CALL JERRC
	TYPE < minutes due to >
	LDB 2,[POINT 2,-4(P),17];REASON FIELD
	CAIN 2,0
	 TYPE <panic>
	CAIN 2,1
	 TYPE <scheduled hardware PM>
	CAIN 2,2
	 TYPE <scheduled software reload>
	CAIN 2,3
	 TYPE <emergency restart>

IMPST5:	CALL CRIF
	SKIPN 2,-5(P)		;NETRDY[5] IS READY LINE OFF TIME
	TYPE <The ready line has not gone off since Tenex was restarted>
	JUMPE 2,IMPST6
	TYPE <Most recent ready line off was >
	SKIPG 2
	 TYPE <when Tenex was restarting>
	SETZ 3,			;STANDARD FORMAT
	SKIPL 2
	 ODTIM

IMPST6:	CALL CRIF
	SKIPN 2,-6(P)		;NETRDY[6] IS READY LINE ON TIME
	TYPE <The ready line has not come on since Tenex was restarted>
	JUMPE 2,IMPSTX
	TYPE <Most recent ready line on was >
	SKIPG 2
	 TYPE <when Tenex was restarting>
	SETZ 3,			;STANDARD FORMAT
	SKIPL 2
	 ODTIM


IMPSTX:	SUB P,[9,,9]		;FLUSH TEMPS
	PRINT EOL
	PRINT EOL
	RET
;.USEST

;USESTAT

.USEST:	ETYPE < Used %B% in %C%
>
	;ADD CODE TO TYPE USAGE OF RTI, E&S, ETC., IF USED
	RET
;.DSKST .DISCU DSKCNT DSKST1 DSKST2 DSKST3 DSKST5 DSKST4 CHKDAL

;DSKSTAT

.DSKST:	CALL DSKCNT	;COUNT PAGES
	ETYPE < %7Q Total pages in use - %5Q allowed, %4Q undeleted, %6Q deleted
>
	TLNE Z,B3
	ETYPE < excluding file(s) that are list protected from you
>


; "DISCUSE"

.DISCU:	MOVE A,[600000,,777777]	;DSK: DESIGNATOR
	GDSKC
	ETYPE < System total: %2Q pages left, %1Q used
>
	JRST RLJFNS		;RELEASE JFNS AND RETURN

DSKCNT:	SETZB D,F		;FOR SUMS OF TOTAL AND DELETED PAGES
	SETO A,
	MOVE C,JBUFP
	PUSH C,A
	HRLZI A,B2+B8+B11+B17	;OLD, *'S, SHORT CALL, INCL. DELETED
	HRROI B,[ASCIZ /*.*;*/]
	GTJFN
	CALL [	CAIE A,GJFX20
		CAIN A,GJFX32
		JRST [	SUB P,[1,,1]	;FOR NO FILES IN DIRECTORY,
			SETZ G,		;CLEAR TOTAL
			JRST DSKST5]	;TYPE "0 PAGES"
		JRST JERR]
	MOVEM A,(C)		;STACK JFN FOR RELEASING ON
	MOVEM C,JBUFP		;UPDATE JFN STACK
	MOVE E,A		; ERR OR COMPLETION

;LOOP OVER FILES WITH GNJFN
DSKST1:	TLZ Z,B1		;RESET DELETED BIT
	HRRZ A,E		;JFN ONLY
	MOVE B,[1,,FDBCTL]	;CONTROL BITS WORD OF FDB
	MOVEI C,C		;TO BE PUT IN C
	CALL $GTFDB		;GET IT
	JRST DSKST2		;COULDN'T
	TLNE C,(FDBDEL)		;DELETED?
	TLO Z,B1		;YES, SAY SO
	MOVE B,[1,,FDBBYV]	;# PAGES IN RH
	MOVEI C,C
	CALL $GTFDB		;DO GTFDB JSYS, NO SKIP IF NO ACCESS
DSKST2:	TLOA Z,F3		;SAY ACCESS ERROR AND SKIP ADD
	 JRST DSKST4		;GO ADD UP PAGES
DSKST3:	MOVE A,E		;JFN AND FLAGS
	GNJFN			;STEP TO NEXT FILE
	 JRST .+2		;NO MORE FILES
	JRST DSKST1
	MOVE G,D		;FORM SUM
	ADDI G,(F)		;OF DELETED AND UNDELETED
DSKST5:	MOVEI 1,0		;SAY CONNECTED DIRECTORY
	GTDAL			;GET ALLOCATION FOR CONN DIR
	MOVE 5,1		;SAVE FOR PRINTING
	RET			;PRINT RELEVANT NUMS, RELEASE JFN

DSKST4:	TLNE Z,B1		;SUM DELETED OR UNDELETED
	JRST .+3
	ADDI D,(C)		;UNDELETED TOTAL
	JRST DSKST3
	ADDI F,(C)		;DELETED TOTAL
	JRST DSKST3



;CHECK CONNECTED DIRECTORY FOR EXCEEDING DISK ALLOCATION
;USED BY LOGIN, LOGOUT, CONNECT

CHKDAL:	MOVEI 1,0		;SAY CONNECTED DIRECTORY
	GTDAL
	SUB 2,1			;USED MINUS ALLOCATED
	JUMPLE 2,RLJFNS		;JUMP IF NOT OVER ALLOCATION
	CALL CRIF		;BE SURE CARRIAGE IS AT LEFT MARGIN
	ETYPE <%G over allocation by %2Q pages.
>
	JRST RLJFNS		;GO RELEASE JFN
;.MEMST MEMS1 MEMS2 MEMS3

;MEMSTAT
;TYPES, FOR CURRENT FORK, # PAGES, ENTRY VECTOR,
;AND A TABLE GIVING IDENTITY OF EACH PAGE IN FORK.

.MEMST:	SKIPGE FORK
	JRST [	UTYPE [ASCIZ / No program/]
		JRST EOLRET]
;FIRST TYPE TOTAL # PAGES
	HRLZ A,FORK
	PUSH P,[1000]		;HOW MANY PAGES TO DO
	SETZ D,
MEMS1:	RPACS			;CLOBBERS C IF PAGE LOCKED
	TLNE B,B5
	AOS D
	AOS A
	SOSLE C,0(P)		;MORE PAGES TO BE DONE?
	 JRST MEMS1		;YES
	SUB P,[1,,1]		;FLUSH JUNK
	PRINT EOL
	CAIN D,1
	 JRST [	UTYPE [ASCIZ / One page/]
		JRST MEMS2]
	ETYPE < %4Q pages>;

;PRINT ENTRY VECTOR

MEMS2:	MOVE A,FORK
	GEVEC
	JUMPE B,MEMS3		;NONE
	HRRZ A,B
	HLRZ B,B
	ETYPE <, entry vector location %1O length %2O>
MEMS3:	PRINT EOL
	JUMPE D,[RET]		;DONE IF NO PAGES
	PRINT EOL
	;NOW FALL INTO "MMAP" TO TYPE MAP
;MMAP MMAP1 MMAP2 MMAP6 MMAP7

;SUBROUTINE TO TYPE MEMORY MAP FOR CURRENT FORK, FOR MEMSTAT.
;ACS:	D: PAGE #
;	E & F: IDENTITY OF CURRENT PAGE, A LA RMAP A & B.
;	KWV, KWV1: SAVED IDENTITY OF 1ST PAGE OF GROUP.
;	G: INCREMENT FOR PAGE # IN GROUP OF CONSECUTIVE PAGE IDENTITIES.

MMAP:	SETZ D,

;FIND EXISTING PAGE (TREAT INDIRECT POINTERS AS EXISTING)
MMAP1:	HRL A,FORK
MMAP2:	CAIL D,1000
	JRST EOLRET		;NO MORE PAGES, DONE
	HRR A,D
	RPACS
	TLNN B,B5+B6
	AOJA D,MMAP2		;DOESN'T EXIST, TRY NEXT

;FOUND ONE, PRINT NUMBER
	CALL PAGID		;GET FULL IDENTITY
	 JRST .+2		;3-RETURN SUBR, BUT IRRELEVANT HERE.
	 JRST .+1
	MOVE KWV,E		;SAVE IDENTITY FOR LATER COMPARISONS
	MOVE KWV1,F		;...AND PRINTING
	SETZ G,			;INIT # CONSECUTIVE IDENTITIES
	HRRZ B,D
	CALL TOCT		;PRINT PAGE NUMBER IN OCTAL

;LOOK AT IDENTITY OF NEXT PAGE
	CALL NPAGID		;STEPS D AND GETS IDENTITY
	 SOJA G,MMAP10		;DIFFERENT, GO TYPE IDENTITY
	 JRST MMAP6		;NEXT HIGHER IN SAME FILE OR FORK

;IDENTICAL, SEE HOW MANY MORE ARE
	CALL NPAGID
	 JRST .+3		;DIFFERENT
	 JRST .+2		;NEXT HIGHER
	JRST .-3		;IDENTICAL, KEEP LOOKING
	SETZ G,			;SAY IDENTICAL NOT CONSECUTIVE GROUP
	JRST MMAP7		;GO PRINT "-# <FILE OR FORK> #

;NEXT HIGHER OF SAME FILE OR FORK, SEE HOW MANY MORE ARE CONSECUTIVE
MMAP6:	CALL NPAGID
	 JRST .+2		;DIFFERENT
	 JRST .-2		;CONSECUTIVE, KEEP LOOKING

;PRINT "-#" FOR GROUP OF IDENTICAL OR CONSECUTIVE PAGES
MMAP7:	PRINT "-"
	MOVEI B,-1(D)		;LAST IN GROUP WAS THE PREVIOUS PAGE
	CALL TOCT		;TYPE IN OCTAL
;MMAP10 MMAP11 MMAP13

;MMAP...
;PRINT IDENTITY OF PAGES WHOSE #'S WE HAVE JUST PRINTED:
;TYPICALLY FORK OR FILE NAME, # FOR A SINGLE PAGE OR IDENTICAL GROUP,
; #-# FOR CONSECUTIVE GROUP. ALL PRECEDED BY @ IF INDIRECT.

MMAP10:	PRINT TAB
	PRINT " "
	TLNE KWV1,B6
	UTYPE [ASCIZ /@ /]	;INDICATE INDIRECT POINTER
	TLNN KWV1,B5		;DOES PAGE EXIST?
	JRST [	UTYPE [ASCIZ /No page/] ;CAN HAPPEN WITH INDIRECT.
		JRST MMAP13]
	TLNE KWV1,B10
	JRST [	UTYPE [ASCIZ /Private/]
		JRST MMAP13]
	CAMN KWV,[-1]		;RMAP RETURNS -1 IF NO JFN FOR FILE
	JRST [	UTYPE [ASCIZ /Forgotten file/]
		JRST MMAP13]
	LDB B,[POINT 9,KWV,17]	;JFN OR FORK #
	TLNE KWV,B0		;ON IF FORK
	JRST [	UETYPE [ASCIZ /Fork %2O/]
		JRST MMAP11]
	MOVE A,COJFN
	SETZ C,
	JFNS			;PRINT FILE NAME
MMAP11:	TYPE <  >;
	HRRZ B,KWV
	CALL TOCT		;PAGE # IN FILE OR FORK
	JUMPLE G,MMAP13		;0 INDICATES ONE PAGE ONLY
	PRINT "-"
	ADDI B,-1(G)		;DON'T COUNT LAST PAGE TESTED!
	CALL TOCT		;PRINT LAST PAGE OF CONSECUTIVE GROUP
MMAP13:	TYPE (  )
	TLZ Z,F1		;USED BY "BEFORE"
	TLNN KWV1,B2
	JRST .+3
	CALL BEFORE		;TYPE COMMA OR EOL BETWEEN ITEMS
	PRINT "R"
	TLNN KWV1,B3
	JRST .+3
	CALL BEFORE		;SUBR WITH "AVAIL DEVICES"
	PRINT "W"
	TLNN KWV1,B9
	JRST .+3
	CALL BEFORE
	TYPE <CW>;		;COPY-ON-WRITE
	TLNN KWV1,B4
	JRST .+3
	CALL BEFORE
	PRINT "E"
	TLNN KWV1,B7		;LOCKED BY USER BIT
	 JRST .+3
	CALL BEFORE
	PRINT "L"
	PRINT EOL
	JRST MMAP1		;GO BACK FOR ANOTHER PAGE OR GROUP
;NPAGID PAGID PAGID8 PAGID9

;SUBROUTINE FOR MMAP TO GET AND COMPARE IDENTITY OF PAGE
;TAKES IN D: PAGE #, IN KWV, KWV1: IDENTITY OF FIRST PAGE IN GROUP,
; IN G: PAGE # INCREMENT FOR CONSECUTIVE GROUP.
;RETURNS: E, F: IDENTITY OF PAGE, A LA RMAP.
;	+1: DIFFERENT IDENTITY FROM FIRST PAGE OF GROUP
;	+2: NEXT HIGHER PAGE # (THAN KWV1+G, G), G INDEXED
;	+3: IDENTICAL
;IF D > 777, BEHAVES AS THOUGH CURRENT PAGE IS NON-EXISTENT.
;CLOBBERS A,B.

NPAGID:	ADDI D,1		;ENTRY FOR NEXT PAGE
	ADDI G,1
PAGID:	MOVE A,D		;ENTRY TO NOT INDEX PAGE #
	SETZ E,			;FOR NON-EXISTENT OR PRIVATE PAGE
	CAIL A,1000
	JRST [	HRLZI F,B5	;PAGES OVER 777 DON'T EXIST
		JRST PAGID8]
	HRL A,FORK
	RPACS
	HLLZ F,B		;RETURN RPACS INFO IN F
	TLNE B,B5		;DOESN'T EXIST?
	TLNE B,B10		;PRIVATE?
	JRST PAGID8		;THIS IS ALL THE INFO WE NEED.
	RMAP			;GET FILE/FORK HANDLE AND PAGE # THEREIN
	MOVE E,A		;...INTO E.

;COMPARISON TO DETERMINE WHETHER SAME AS PREVIOUS PAGE
;COMPARE THAT INFO WHICH IS PRINTED:
; ALL E, F BITS 2-6, 9, 10.
PAGID8:	MOVE A,E
	XOR A,KWV
	TLNE A,-1
	JRST PAGID9		;DIFFERENT FILES OR FORKS, R1
	MOVE B,F		;RMAP'S ACCESS IS WRONG (1/22/71)
	XOR B,KWV1
	TLNE B,<37B6+1B7+3B10>B53
	JRST PAGID9		;DIFFERENT ACCESS, R1.
	TRNE A,-1
	JRST [	MOVE A,G
		ADD A,KWV
		SUB A,E
		TRNE A,-1
		JRST .+3	;REALLY DIFFERENT PAGE, R1
		JRST .+2]	;NEXT HIGHER PAGE #, R2
	AOS (P)			;SAME IDENTITY INCLUDING PAGE #, R3.
	AOS (P)
PAGID9:	RET
;.FILST ASTTJ

;FILSTAT

.FILST:	PRINT EOL
	GJINF
	CAME A,B		;COMPARE LOGIN AND CONNECTED DIRECTORIES
	ETYPE < Connected to <%G%>. >;

;JFNS
	TYPE < JFNs:
>
	MOVEI D,MAXJFN		;JFN AND COUNTER
	CALL JSTAT		;TYPE INFO IF JFN ASSIGNED
	SOJGE D,.-1
	PRINT EOL

;DEVICES ASSIGNED TO THIS JOB
	PUSH P,[[TLNE Z,F1	;SET RETURN FOR ASTTJ
		PRINT EOL
		RET]]


;"AVAILABLE DEVICES" ALSO COMES HERE TO TYPE DEVS ASS TO THIS JOB.
ASTTJ:	GJINF			;GET JOB # IN C
	MOVE E,C
	TLZ Z,F1
	CALL DEVLUP		;GET NAME & CHARACTERISTICS FOR EACH
				;DEVICE AND EXECUTES THE NEXT LOCATION.
	 CALL [	CAME C,E	;ASSIGNED TO THIS JOB?
		RET		;NO.
		TLNN Z,F1	;FIRST ONE? ("BEFORE" SETS F1)
		UTYPE [ASCIZ / Devices assigned to this job:/]
		CALL BEFORE	;COMMA OR CR OR NIL. AFTER "AVAIL DEV".
		JRST SIXPRT]	;PRINT SIXBIT NAME FROM A.
	TLNE Z,F1
	PRINT EOL
	RET
;JSTAT ILIJFN

;TYPE STATUS OF JFN IN RH OF D.
;NOP IF UNASSIGNED.
;IF ASSIGNED, TYPE <JFN> <NAME>
;AND WHAT OPEN FOR AND "NOT OPEN" OR "DATA ERROR" OR "EOF" IF PERTINENT.
;DESTROYS A, B, C, E.  USED IN "FILSTAT".

JSTAT:	HRRZ A,D
	GTSTS
	TLNN B,200
	RET		;UNASSIGNED, RETURN.
	MOVE E,B	;STATUS FOR USE BELOW
	PRINT " "
	MOVE A,COJFN
	HRRZ B,D
	MOVE C,[4,,10]
	NOUT		;JFN, LEFT ADJ IN 4 COLS
	 CALL JERRC
	HRRZ B,D
	SETZ C,		;DEFAULT FORMAT

	MOVEI A,ILIJFN
	MOVEM A,ILIDSP	;SET SPECIAL ILLEGAL INSTRUCTION DISPATCH
	MOVE A,COJFN	;PRIMARY OUTPUT JFN
	JFNS		;PRINT NAME OR TRAP
	SETZM ILIDSP	;CANCEL INSTRUCTION TRAP
	JRST JSTAT2



;HERE IF JFNS TRAPS

ILIJFN:	TLNN E,(1B17)	;LOOK AT STATUS WORD
	 JRST ILIPSI	;TRAPPED FOR SOME OTHER REASON
	TYPE <Restricted to some other fork>
	PRINT EOL
	RET		;FROM JSTAT
;JSTAT2 JSTAT3 JSTAT4 JSTAT5 JSTAT6 JSTAT7 JSTAT8 JSTAT9 JSTA10

;JSTAT...
;TYPE "NOT OPEN" OR LIST OF "READ", "EXECUTE", ETC.
;IF B0 ON AND B1-3 & 5-6 OFF, TYPES NOTHING. CAN THIS HAPPEN? ←←←←←← 
JSTAT2:	PRINT TAB
	TLZ Z,F1		;TELL "BEFORE" NOTHING HAS BEEN PRINTED
	TLNN E,B0
	TYPE < Not opened>;
	TLNN E,B1
	JRST JSTAT3
	CALL BEFORE		;TYPE SPACE OR COMMA-SPACE OR EOL-SPACE
	TYPE <Read>;
JSTAT3:	TLNN E,B2		;OK TO WRITE
	JRST JSTAT4
	CALL BEFORE
	TLNN E,B4		;ALSO OK TO CHANGE POINTER?
	TYPE <Append>;		;NO
	TLNE E,B4
	TYPE <Write>;		;YES
JSTAT4:	TLNN E,B3		;EXECUTE
	JRST JSTAT5
	CALL BEFORE
	TYPE <Execute>;
JSTAT5:	TLNN E,B5		;AS SPECIFIED BY PAGE TABLE
	JRST JSTAT6
	CALL BEFORE
	TYPE <Per page table>;
JSTAT6:	TLNN E,B6		;CALL AS PROCEDURE
	JRST JSTAT7
	CALL BEFORE
	TYPE <Procedure>;
JSTAT7:	TLNN E,B9
	JRST JSTAT8
	CALL BEFORE
	TYPE <Data error>;
JSTAT8:	TLNN E,B8
	JRST JSTAT9
	CALL BEFORE
	TYPE <EOF>;
JSTAT9:	TLNE E,B1!B2
	TLNN E,B0
	 JRST JSTA10
	TLNE E,B3!B6
	JRST JSTA10
	HRRZ A,D
	RFPTR
	 CALL JERR
	CALL BEFORE
	MOVE A,COJFN
	MOVEI C,12
	NOUT
	 CALL JERRC
	MOVEI B,"."
	BOUT			;INDICATE DECIMAL
JSTA10:	JRST EOLRET
;.SYSTA SYST1 SYST2 SYST3

;SYSTAT

.SYSTA:	CALL CRIF		;TYPE CRLF-SPACE IF NEEDED
	MOVE A,['SYSTAT']
	MOVEI B,14
	CALL MORET		;GET LOAD AVERAGES
	ETYPE < Load %4Q %5Q %6Q   Up %K   %I   %D %E
>
	CALL LGNCHK		;TYPE MSG IF NOT PERMITTING LOGINS
	CALL DWNTIM		;PRINT SHUTDOWN WARNING, IF ANY
	MOVE A,['NCPGS ']
	CALL $SYSGT
	ETYPE < %1Q pages of user core >
	TLZA Z,F3	;NORMAL VERSION

;SPECIAL HACK FOR MGM'S INFERIOR TERMINALS
.QSYSTAT:	TLO Z,F3	;QUICK VERSION (ONLY P1)
	TLZ Z,F1+F2		;START WITH PASS ONE

;LOOP TO TYPE TSS JOB #, TTY #, USER  FOR EACH JOB
SYST1:	SETO D,
	GTB 1			;GET # POSSIBLE JOBS
	HRLZ D,A		;AOBJN COUNT,,JOB #

;TOP OF LOOP
SYST2:	GTB 1			;TABLE 1: POSITIVE IF JOB EXISTS
	JUMPL A,SYST9

;HAVE A REAL JOB #. PRINT IT.
	GTB 0
	HLRE B,A
	CAIN B,20		;FIB GOES ON PASS 2
	 TLNN Z,F2
	 CAIA
	JRST SYST3
	TLNN Z,F2		;IF PASS 1 ...
	 JUMPLE B,SYST9		;IGNORE DETACHED JOBS AND TTY0
	TLNE Z,F2		;IF PASS 2 ...
	 JUMPG B,SYST9		;IGNORE NON-DETACHED JOBS EXCEPT TTY0
	HLRZ B,A
	CAIN B,20		;FIB GOES ON PASS 2
	 TLNE Z,F2
	 CAIA
	JRST SYST9
;PRINT ONE JOB
SYST3:	TLON Z,F1		;TYPE HEADER FIRST TIME.
	TYPE <

 Job TTY  User      Subsys  Pg faults   CPU   <Connected>[Foreign host]
>
	PRINT " "
	HRRZ B,D
	MOVE A,COJFN
	MOVE C,[4,,↑D10]	;LEFT ADJ IN 4 COLS, DECIMAL
	NOUT			;CONVERT AND PRINT JOB #
	 CALL JERRC

;"DET" OR "TTY N"
	GTB 0			;TABLE 0: LH NEG OR LINE # FOR THIS JOB
	JUMPL A,[UTYPE [ASCIZ /Det  /]
		JRST SYST4]
	HLRZ B,A
	MOVE A,COJFN
	MOVE C,[5,,10]		;LEFT ADJ IN 5 COLS, OCTAL
	NOUT			;LINE #.
	 CALL JERRC
;SYST4 SYST5 SYST5A SYST8 SYST8A SYST8Y SYST9 SYST8X SYST8W

;SYSTAT...
;SUBSYSTEM NAME

;USER NAME OR "?" IF CONVERSION FAILS.
SYST4:	GTB 3			;TABLE 3: RH: USER'S DIR #
	HRREI B,(A)		;0 IF NOT LOGGED IN
	JUMPLE B,[UTYPE [ASCIZ /Not logged in  /]
		JRST SYST8Y]
	MOVE A,COJFN
	DIRST			;CONVERT DIR # TO STRING AND PRINT
	 PRINT "?"		;NOT FOUND (NO SYSTEM ERROR # IN A)

SYST5:	MOVE A,[SIXBIT /JOBNAM/]
	CALL $SYSGT	;GET # OF TABLE CONTAINING SNAMES INDICES
	JUMPE B,SYST8	;NO SUCH TABLE: NOT IMPLEMENTED YET
	HRR A,B		;TABLE NUMBER
	HRL A,D		;INDEX: TSS JOB #
	GETAB		;GET SNAMES INDEX INTO A
	 CALL JERR
	MOVE C,A
	MOVE A,[SIXBIT /SNAMES/]
	CALL $SYSGT	;GET # OF SUBSYSTEM NAMES TABLE
	JUMPE B,SYST8
	HRR A,B
	HRL A,C		;INDEX FROM TABLE JOBNAM
	GETAB
	 CALL JERR
	PUSH P,A
		;POSITION CARRIAGE, TYPING A MAXIMUM OF 10 SPACES
	MOVEI C,12
SYST5A:	PRINT " "
	MOVE A,COJFN
	RFPOS		;VALID ONLY FOR TTYS
	MOVEI B,(B)	;MASK HORIZ POSITION
	CAIGE B,24
	SOJGE C,SYST5A
	POP P,A		;NAME AGAIN
	JUMPE A,[PRINT "?"
		JRST SYST8]
	CALL SIXPRT	;PRINT IT
			;SIXPRT IS WITH "AVAIL DEV" IN X1CMD.MAC
SYST8:	MOVEI C,12
SYST8A:	PRINT " "
	MOVE A,COJFN
	RFPOS		;VALID ONLY FOR TTYS - ELSE RETS 0
	MOVEI B,(B)	;MASK HORIZ POSITION
	CAIGE B,24+6+2
	SOJGE C,SYST8A

	GTB 12		;JOB PAGE FAULTS
	MOVE B,A
	MOVE C,[1B2+9B17+↑D10]
	MOVE A,COJFN
	NOUT
	 JFCL

	GTB 1		;CPU TIME
	MOVE B,A
	MOVE C,[1B2+9B17+↑D10]
	MOVE A,COJFN
	NOUT
	 JFCL
	PUSHJ P,SYST8X	;CONN DIR

SYST8Y:	GTB 0
	HLRZS A
	PUSHJ P,WHERE4		;PRINT FOREIGN HOST IF ANY
	 JFCL
	PRINT EOL
SYST9:	AOBJN D,SYST2
	TLNE Z,F3
	 JRST EOLRET		;QUICK VERSION, ONLY PASS1
	TLON Z,F2		;SWITCH TO PASS2
	 JRST SYST1		;AND PRINT THE REST
	JRST EOLRET

;
; PRINT CONNECTED DIRECTORY
;
SYST8X:	PUSH P,A
	GTB 3
	HLRZ B,A
	HRRZ C,A
	CAMN B,C
	 JRST SYST8W
	MOVE A,COJFN
	PRINT "<"
	DIRST
	 JFCL
	PRINT ">"
SYST8W:	POP P,A
	POPJ P,
;.STATI

;STATISTICS

.STATI:	CONFIRM		;CAN'T USE TABLE BIT "ONEWD" BECAUSE
		;FUDGE-ENTRY FOR "STAT" TYPES OUT AFTER DISPATCH
	MOVE A,[SIXBIT /SYSTAT/]
	CALL READT	;READ SYSTEM STATISTICS TABLE INTO AC'S 4-13
	ETYPE <
 Idle %4T  waiting %5T  core management %6T  pager traps %7T
 Swap reads %10Q writes %11Q  DSK reads %12Q writes %13Q
>
	MOVE A,[SIXBIT /NCPGS/]
	CALL $SYSGT
	ETYPE < %1Q pages of user core
>
	MOVE A,[SIXBIT /SYSTAT/]
	MOVEI B,10
	CALL MORET		;READ MORE OF TABLE
	TIME			;TOTAL UPTIME OF SYSTEM
	CALL FLOAT
	EXCH 1,6
	CALL FLOAT		;FLOAT NBAL TOTAL
	EXCH 1,7
	CALL FLOAT		;FLOAT NRUN TOTAL
	EXCH 1,6
	FDVR 6,1		;NRUN AVERAGE
	FDVR 7,1		;NBAL AVERAGE
	ETYPE < %4Q terminal wakeups  %5Q terminal interrupts
 NBAL average %7Q  NRUN average %6Q
>;
	MOVE A,[SIXBIT /QTIMES/]
	CALL READT
	ETYPE < Runtime of jobs on queues 0-5 (msec)
	%4Q	%5Q	%6Q	%7Q	%10Q	%11Q
>;
;STAT3 STAT51 STAT5A STAT6A STAT6B STAT6C STAT6E STAT6F STAT6G STAT5C STAT5Y STAT5Z STAT6 STAT5N SNAMS

;STATISTICS...
;TABLE OF SUBSYSTEM USAGE

STAT3:	TYPE <
 Subsys       Time   Pg Flts  Time/Flt  Av W-set  Flt/Wake
>
	MOVEI 6,1(P)		;PLACE ON STACK TO STORE TABLE NUMBERS
	HRLI 6,5
	ADD P,[NSNAMS,,NSNAMS]
	MOVSI 5,-NSNAMS		;NUMBER OF TABLES TO EXAMINE
STAT51:	MOVE A,SNAMS(E)		;GET SIXBIT NAME OF TABLE
	CALL $SYSGT
	MOVEM B,@6		;SAVE TABLE NUMBER
	AOBJN 5,STAT51
	HLLZ 4,0(6)		;LENGTH OF (FIRST) TABLE
STAT5A:	MOVSI 5,-NSNAMS		;TABLE COUNTER FOR EACH SUBSYS
	HRRZ A,@6
	GTB (A)			;GET NAME OF SUBSYSTEM IN THIS SLOT
	JUMPE A,STAT5Z		;0 MEANS NONE THERE
	PRINT " "
	CALL SIXPRT		;PRINT THE NAME
	PRINT TAB
	AOBJN 5,.+1

STAT6A:	HRRZ A,@6		;GET 2ND ENTRY
	GTB (A)			;GET TIME
	PUSH P,A		;SAVE FOR LATER
	MOVE B,A
	CALL STAT5N		;PRINT IT
	AOBJN 5,.+1		;KEEP POINTER UP TO DATE

STAT6B:	HRRZ A,@6		;GET FAULTS
	GTB (A)
	MOVE B,A
	CALL STAT5N		;PRINT IT
	AOBJN 5,.+1		;UPDATE

STAT6C:	MOVE A,B
	CALL FLOAT
	EXCH A,0(P)		;FLTS TO PDL, TIME TO A
	CALL FLOAT
	FDVR A,0(P)		;TIME PER FAULT
	ETYPE <    %1Q>		;PRINT IT

STAT6E:	HRRZ A,@6
	GTB (A)
	PUSH P,A		;WAKES & AV. WORKING SET SIZE
	LDB A,[POINT 15,A,14]	;THIS WORD HAS TWO FIELDS
	CALL FLOAT		;FLOAT EACH FIELD
	EXCH A,0(P)		;WAKES TO PDL, WSET TO A
	TLZ A,(-1B14)
	CALL FLOAT
	FDVR A,0(P)		;COMPUTE AVERAGE
	ETYPE <    %1Q>
STAT6F:	MOVE A,-1(P)		;FAULTS
	FDVR A,0(P)		;FAULTS/WAKEUP
	ETYPE <    %1Q>

STAT6G:	SUB P,[2,,2]		;FLUSH JUNK
	AOBJP 5,STAT5Y		;ANYMORE TABLES TO PRINT?

STAT5C:	HRRZ A,@6		;TABLE NUMBER
	GTB (A)			;GET DATA
	MOVE B,A
	CALL STAT5N		;PRINT DECIMAL VALUE
	AOBJN 5,STAT5C
STAT5Y:	PRINT EOL

STAT5Z:	AOBJN 4,STAT5A
	SUB P,[NSNAMS,,NSNAMS] ;REMOVE TEMP STORAGE
STAT6:	JRST EOLRET

;PRINT FORMATTED NUMBER

STAT5N:	MOVE A,COJFN
	MOVE C,[1B0+1B2+1B4+12B17+↑D10]
	NOUT
	JRST [	CAIE A,NOUTX2	;CHECK FOR COLUMN OVERFLOW ERROR CODE
		CAIN C,NOUTX2	;IN A OR C
		RET		;ALLOW IT
		JRST JERR]	;REPORT ANY OTHER ERROR
	RET

;TABLES TO BE PRINTED IN STATISTICS FOR SUBSYSTEMS

SNAMS:	SIXBIT /SNAMES/		;MUST BE FIRST
	SIXBIT /STIMES/		;MUST BE SECOND
	SIXBIT /SPFLTS/		;MUST BE THIRD
	SIXBIT /SWAKES/		;MUST BE FOURTH
;***  OTHERS MAY BE INSERTED HERE ***
NSNAMS==.-SNAMS
;.ERRST SYST11 SYST12

;ERRSTAT: PRINT VARIOUS ERROR INFORMATION

.ERRST:;	MOVEI A,400000
;	RPCAP
;	TRNN B,1B18+1B19+1B20+1B21	;WHEEL, CONFI, OPER, MAINT.
;	JRST CERR

;DISK ERRORS
	MOVE A,[SIXBIT /DSKERR/]
	CALL READT		;READ DISK ERRORS TABLE INTO AC'S D + .
	JUMPN D,.+2
	JUMPE 11,[UETYPE [ASCIZ /
 No disk errors
/]
		JRST SYST11]
	ETYPE <
 Disk errors: %4Q recoverable  >
	JUMPE D,.+2
	ETYPE <
 Command words for last recoverable error:
  %5O
  %6O
  %7O
 Error bits: %10O
>;
	ETYPE < %11Q irrecoverable
>;
	JUMPE 11,.+2
	ETYPE < Command words for last irrecoverable error:
  %12O
  %13O
  %14O
 Error bits: %15O
>;
;DRUM ERRORS

SYST11:
;	MOVE A,[SIXBIT /DRMERR/]
;	CALL READT
;	JUMPE D,[UETYPE [ASCIZ /
; No drum errors
;/]
;		JRST SYST12]
;	ETYPE <
; %4Q drum errors
; Command words for last error:
;  %5O
;  %6O
;  Error bits: %7O
;>;
SYST12:	JRST EOLRET
;READT MORET READT1

;SUBROUTINE TO READ SYSTEM TABLE WHOSE NAME IS IN A INTO AC'S 4-16.
;USED IN SYSTAT, ERRSTAT.

READT:	SETZ B,		;NORMAL ENTRY: START AT BEGINNING OF TABLE
MORET:	MOVE D,B	;ENTRY FOR TABLE INDEX IN B
	CALL $SYSGT
	JUMPN B,.+2
	CALL SCREWUP	;NO SUCH TABLE
	HLLZ C,B	;FORM AOBJN INDEX
	SOJGE D,[AOBJP C,[RET]	;PASS UNWANTED ENTRIES
		JRST .]
	PUSH P,[D]	;INIT PTR TO AC'S TO STORE VALUES IN
READT1:	HRR A,B		;TABLE #
	HRL A,C		;INDEX
	GETAB		;READ A WORD OF TABLE INTO A
	 CALL JERR
	MOVEM A,@(P)
	AOS A,(P)
	CAIGE A,P	;STOP BEFORE OVERWRITING P!
	AOBJN C,READT1	;END-OF-TABLE TEST AND LOOP
	SUB P,[1,,1]
	RET
;.TRMST TRMST0 TRMST1 TRMST2 TRMST3 TRMST4 TRMST5 TRMST6 TRMS60 TRMS61 TRMS62 TRMS63 TRMS64 TRMST7 TRMST8 TRMST9 TRMS10 TRMS11 TRMS12 TRMS13 TRM131 TRM132 TRMS14 TRM141 TRM142 TRM143 TRM144 TRM145

;TERMINAL STATUS COMMAND  "TRMSTAT"


.TRMST:	SKIPN PTTYMD		;DOES PROGRAM HAVE A TERMINAL?
	 ERROR <Terminal status not yet defined>
TRMST0:	MOVE 1,COJFN
	RFMOD
	MOVE 3,[7B3!177B10!177B17!3B27!3B31!3B33]	;STPAR BITS
	AND 2,3			;EXTRACT THESE
	ANDCAM 3,PTTYMD+0	;FLUSH FROM PTTYMD
	IORM 2,PTTYMD+0		;UPDATE
	GTTYP
	ETYPE < Terminal type: %2O>
	PRINT EOL

TRMST1:	MOVSI 1,(1B1)
	TDNN 1,PTTYMD+0
	 TYPE < Lacks>
	TDNE 1,PTTYMD+0
	 TYPE < Has>
	TYPE < mechanical formfeed>
	PRINT EOL

TRMST2:	MOVSI 1,(1B2)
	TDNN 1,PTTYMD+0
	 TYPE < Lacks>
	TDNE 1,PTTYMD+0
	 TYPE < Has>
	TYPE < mechanical tabs>
	PRINT EOL

TRMST3:	MOVSI 1,(1B3)
	TDNN 1,PTTYMD+0
	 TYPE < Lacks>
	TDNE 1,PTTYMD+0
	 TYPE < Has>
	TYPE < lowercase>
	PRINT EOL

TRMST4:	LDB 2,[POINT 7,PTTYMD+0,10]
	ETYPE < Page length is: %2Q.>
	PRINT EOL

TRMST5:	LDB 2,[POINT 7,PTTYMD+0,17]
	ETYPE < Line width is: %2Q.>
	PRINT EOL

TRMST6:	TLZ Z,F1		;COMMUNICATE WITH "BEFORE"
	TYPE < Wake-up set: >
	LDB 1,[POINT 2,PTTYMD+0,21]
	CAIE 1,3
	 JRST TRMS60
	CALL BEFORE
	TYPE <All controls>
	JRST TRMS62
TRMS60:	MOVEI 1,1B20
	TDNN 1,PTTYMD+0
	 JRST TRMS61
	CALL BEFORE
	TYPE <Formatting controls>
TRMS61:	MOVEI 1,1B21
	TDNN 1,PTTYMD+0
	 JRST TRMS62
	CALL BEFORE
	TYPE <Non-formatting controls>
TRMS62:	MOVEI 1,1B22
	TDNN 1,PTTYMD+0
	 JRST TRMS63
	CALL BEFORE
	TYPE <Punctuation>
TRMS63:	MOVEI 1,1B23
	TDNN 1,PTTYMD+0
	 JRST TRMS64
	CALL BEFORE
	TYPE <Alphanumerics>
TRMS64:	PRINT EOL

TRMST7:	LDB 2,[POINT 2,PTTYMD+0,25]
	TYPE < Echo mode is: >
	CAIN 2,0
	 TYPE <none>
	CAIN 2,1
	 TYPE <immediate>
	CAIN 2,2
	 TYPE <immediate or deferred>
	CAIN 2,3
	 TYPE <immediate and deferred>
	PRINT EOL

TRMST8:	TYPE < Links are being >
	MOVEI 1,1B26
	TDNN 1,PTTYMD+0
	 TYPE <refused>
	TDNE 1,PTTYMD+0
	 TYPE <accepted>
	PRINT EOL

TRMST9:	TYPE < Terminal data mode is: >
	MOVEI 1,1B29
	TDNE 1,PTTYMD+0
	 TYPE <ASCII>
	TDNN 1,PTTYMD+0
	 TYPE <binary>
	PRINT EOL

TRMS10:	TYPE < Lowercase output is being >
	MOVEI 1,1B30
	TDNN 1,PTTYMD+0
	 TYPE <sent to terminal>
	TDNE 1,PTTYMD+0
	 TYPE <indicated by %X>
	PRINT EOL

TRMS11:	TYPE < Lowercase input is being >
	MOVEI 1,1B31
	TDNN 1,PTTYMD+0
	 TYPE <sent directly>
	TDNE 1,PTTYMD+0
	 TYPE <converted to uppercase>
	PRINT EOL

TRMS12:	LDB 2,[POINT 2,PTTYMD+0,33]
	CAIN 2,0
	 TYPE < Full duplex>
	CAIN 2,2
	 TYPE < Character half duplex>
	CAIN 2,3
	 TYPE < Line half duplex>
	CAIN 2,1
	 TYPE < Undefined duplexity>
	PRINT EOL

TRMS13:	TLZ Z,F1		;INITIALIZE "BEFORE"
	TYPE < Tab stops:>
	MOVE 2,[POINT 1,PTTYMD+1]
	MOVEI 3,0		;COLUMN TO PRINT
	MOVEI 4,↑D<3*36>	;HOW MANY TO TEST
TRM131:	ILDB 1,2
	JUMPE 1,TRM132		;NO TAB IN THIS COLUMN
	CALL BEFORE
	ETYPE <%3Q>
TRM132:	ADDI 3,1		;BUMP COLUMN NUMBER
	SOJG 4,TRM131

TRMS14:	MOVEI 3,3		;TYPE BEING SCANNED FOR, THIS PASS
TRM141:	MOVE 4,[POINT 2,PTTYMD+4]	;INITIAL POINTER TO CCOC BYTES
	MOVEI 5,100		;CHARACTER TO PRINT
	MOVEI 6,40		;HOW MANY TO CHECK
	TLZ Z,F1!F2		;FOR "BEFORE" AND HEADING PRINTER

TRM142:	ILDB 1,4		;PICK UP CCOC BYTE
	CAIE 1,0(3)		;SAME AS THAT BEING SCANNED FOR?
	 JRST TRM145		;NO
TRM143:	TLOE Z,F2		;HAS HEADING BEEN OUTPUT?
	 JRST TRM144		;YES
	CAIN 3,0
	 TYPE <
 Ignored controls:>
	CAIN 3,1
	 TYPE <
 Indicated controls:>
	CAIN 3,2
	 TYPE <
 Sent controls:>
	CAIN 3,3
	 TYPE <
 Simulated controls:>
TRM144:	CALL BEFORE		;PRINT COMMA IF NEEDED
	PRINT "↑"
	PRINT 0(5)
TRM145:	ADDI 5,1		;MOVE TO NEXT CHARACTER
	SOJG 6,TRM142		;CONTINUE THIS SCAN
	SOJGE 3,TRM141		;MOVE TO NEXT TYPE
	RET
;.FULLD .HALFD .FORMF .TABS TABS1 .SHOW .LOWER .RAISE CMOD .LLENG

;TERMINAL CHARACTERISTICS COMMANDS GROUP
;	LOWERCASE, FORMFEED, TABS, NO LOWERCASE, NO FORMFEED, NO TABS,
;	RAISE, NO RAISE, HALFDUPLEX, FULLDUPLEX, INDICATE.

;THESE COMMANDS CHANGE THE FILE MODE WORD AND THE CONTROL CHARACTER
;OUTPUT CONTROL (CCOC) WORDS FOR THE PRIMARY OUTPUT FILE,
;AND ALSO THE THREE SETS OF THESE VALUES KEPT IN STORAGE.

;THE "NO" PREFIXED VERSIONS GO THRU THE SAME ROUTINES AS THE UNPREFIXED
;VERSIONS, BUT WITH F1 SET WHICH REVERSES THE EFFECT OF THE SUBROUTINES
;THEY CALL.  F1 IS CLEAR ON DISPATCH FROM THE MAIN LOOP.


.FULLD:	TLC Z,F1		;"FULLDUPLEX" = "NO HALFDUPLEX".
.HALFD:	MOVEI C,3B33		;"HALFDUPLEX". "HALF DUPLEX" MODE BIT.
	JRST CMOD		;CHANGE FILE MODE WORD

.FORMF:	HRLZI C,B1		;"FORMFEED". "HAS MECH. FF" MODE BIT
	MOVE D,[POINT 2,(E),25]	;POINTER TO ↑L CCOC BYTE
	JRST TABS1

.TABS:	HRLZI C,B2		;"TABS". "HAS HARDWARE TABS" MODE BIT
	MOVE D,[POINT 2,(E),19]	;PTR TO ↑I CCOC BYTE
TABS1:	CALL CMOD		;CHANGE FILE MODE WORD
	JRST CCCOC		;CHANGE CONT. CHAR. OUTPUT CONT. WORDS

;LOWERCASE: CONTROLS LOWER CASE OUTPUT.
;IT MAY ALSO BE NECESSARY TO CLEAR "INDICATE WITH %" BIT,
;BUT PREFERABLE NOT TO IF IT HAS NO EFFECT WHEN B3 ON.

.SHOW:	NOISE (lower case with '%')
	MOVEI C,1B30	;INDICATE LOWER CASE
	JRST CMOD

.LOWER:	HRLZI C,B3		;"LOWERCASE".  "HAS LOWER CASE" MODE BIT.
	JRST CMOD		;CHANGE FILE MODE WORD

;RAISE: CONTROLS CONVERSION OF LOWER CASE TO UPPER ON INPUT.

.RAISE:	MOVEI C,1B31		;"CONVERT LOWER CASE TO UPPER" MODE BIT


;CHANGE TELETYPE MODE WORD SUBR
;CHANGES MODE IN EFFECT
;TAKES: C: MASK INDICATING BITS TO CHANGE.
;	AC Z LH BIT F1: ON TO CLEAR BIT(S), OFF TO SET THEM.
;PRESERVES D, DESTROYS A, B.

CMOD:	MOVE A,COJFN		;OUTFILE IS MOST LIKELY TO BE TTY
	RFMOD
	ANDCAM C,B
	TLNN Z,F1
	IORM C,B
	STPAR			;THESE ARE ALL TERMINAL PARAMETERS
	RET



;LENGTH (OF PAGE IS) <DECIMAL NUMBER>

.LLENG:	NOISE (of page is)
	CALL DECIN
	 JRST CERR
	ALLOW TSPC+TALT+TEOL
	CONFIRM
	CAIL A,5
	CAILE A,↑D127
	 JRST CERR
	MOVE C,A
	MOVE 1,COJFN
	RFMOD
	DPB C,[POINT 7,2,10]
	STPAR
	RET
;.TERMI $TERMI TRMTAB .VT06 .VTCR .HYTYP .DMN .DM .TI733 .T33 .T35 .T37 .LA30 .NVT .TTY3 .SCOPE SCOPE1 SCOPE2 .BENDI .BEEHI .INFOT .DATA1 .VTS .TI .TI1

;TERMINAL TYPE IS


;NOTE:	GET SOMEBODY AT BBN TO ASSIGN NEW (UNIQUE) TERMINAL NUMBERS
;	IN THE MONITOR.  THIS AVOIDS CONFUSION WITH OTHER SITES.
;	LOCAL STTYP NUMBERS SHOULD BE NEGATIVE NUMBERS.


.TERMI:	NOISE (type is)
	KEYWD $TERMI
	0
	JRST CERR
	JRST (KWV)

$TERMI:	TABLE
	TE 14,,.DMN
	TE 15,,.DM
	TE 33,,.T33
	TE 35,,.T35
	TE 37,,.T37
	TE 4,,.VT06
	TE 4023,,.DATA1
	TE 5,,.VTCR
	TE 6,,.HYTYP
	TE AJ,,.TI
	TE ANDERSON-JACOBSON,,.TI
	TE BEEHIVE,,.BEEHI
	TE BENDIX,,.BENDI
	TE CDI,,.TI
	TE COMPUTER-DEVICES,,.TI
	TE DATA100,,.DATA1
	TE DATAMEDIA,,.DM
	TE DM,,.DM
	TE EXECUPORT,,.TI
	TE INFOTON,,.INFOT
	TE LA30
	TE LOGIPORT,,.BENDI
	TE NCR,,.TI
	TE NVT
	TE SCOPE,,.SCOPE
	TE TEKTRONIX-4023,,.DATA1
	TE TERMINET,,.LA30
	TE TI,,.TI
	TE TI733
	TE VTS
	TEND

;TABLE OF TERMINAL PAGE LENGTHS AND LINE WIDTHS
;LENGTH IN LH, WIDTH IN RH

TRMTAB:	↑D66,,↑D72
	↑D66,,↑D72
	↑D66,,↑D72
	↑D66,,↑D72
	↑D25,,↑D72
	↑D25,,↑D72
	↑D66,,↑D127		;FIELD IS ONLY 7 BITS WIDE
	↑D66,,↑D72
	↑D66,,↑D80
	↑D66,,↑D72
	↑D12,,↑D72
	↑D66,,↑D72
	↑D24,,↑D80
	↑D24,,↑D80

.VT06:	PUSH P,[↑D25]
	PUSH P,[↑D72]
	PUSH P,[4]
	JRST SCOPE1

.VTCR:	PUSH P,[↑D25]
	PUSH P,[↑D72]
	PUSH P,[5]
	JRST SCOPE1

.HYTYP:	PUSH P,[↑D66]
	PUSH P,[↑D80]
	PUSH P,[6]
	JRST SCOPE1

.DMN:	PUSH P,[↑D24]
	PUSH P,[↑D80]
	PUSH P,[14]
	JRST SCOPE1

.DM:	PUSH P,[↑D24]
	PUSH P,[↑D80]
	PUSH P,[15]
	JRST SCOPE1

.TI733:	MOVEI B,11
	JRST .TTY3
.T33:	TDZA B,B
.T35:	MOVEI B,1
	JRST .TTY3
.T37:	SKIPA B,[2]
	MOVEI B,3
	JRST .TTY3
.LA30:	SKIPA B,[10]
.NVT:	MOVEI B,7	;TERM TYPES 4, 5, AND 6 RESERVED
			;SO IS 13
.TTY3:	CONFIRM
	MOVE A,COJFN
	STTYP
	CALL .RAISE	;IN ORDER TO RECOGNIZE ALTMODES
			;DUPLEXITY IS DETERMINED ONLY BY "HALF" AND
			;"FULL".  NVT'S ARE HALF ONLY AS A DEFAULT
	PUSH P,[↑D66]	;PAGE LENGTH
	PUSH P,[↑D72]	;LINE WIDTH
	JRST SCOPE2


;TERMINAL (TYPE IS) SCOPE (PAGE LENGTH) <DEC NUM> (PAGE WIDTH) <DEC NUM>

.SCOPE:	ALLOW TSPC+TALT
	NOISE (page length)
	CALL DECIN
	 JRST CERR
	ALLOW TSPC+TALT
	CAIL A,5
	CAILE A,↑D127
	 JRST CERR
	PUSH P,A
	NOISE (page width)
	CALL DECIN
	 JRST CERR
	ALLOW TSPC+TALT+TEOL
	CAILE A,↑D127
	 JRST CERR
	PUSH P,A
	PUSH P,[12]	;?

SCOPE1:	CONFIRM
	TLO Z,F1		;SAY "NO"
	CALL .RAISE
	TLZ Z,F1		;DON'T MESS UP OTHER CALLERS
	CALL .FORMF		;TURN OFF "INDICATE FORMFEED" STUFF
	MOVE 1,COJFN
	POP P,2			;SCOPE TERMINAL TYPE
	STTYP
SCOPE2:	RFMOD
	POP P,C
	DPB C,[POINT 7,2,17]	;SET WIDTH
	POP P,C
	DPB C,[POINT 7,2,10]	;LENGTH
	STPAR
	RET


;TERMINAL (TYPE IS) BENDIX

.BENDI:	PUSH P,[↑D16]
	PUSH P,[↑D72]
	PUSH P,[12]
	JRST SCOPE1



;TERMINAL (TYPE IS) BEEHIVE

.BEEHI:	PUSH P,[↑D20]
	PUSH P,[↑D72]
	PUSH P,[12]
	JRST SCOPE1


;TERMINAL TYPE INFOTON

.INFOT:	PUSH P,[↑D23]
	PUSH P,[↑D72]
	PUSH P,[12]
	JRST SCOPE1


;TERMINAL TYPE DATA100

.DATA1:	PUSH P,[↑D24]
	PUSH P,[↑D72]
	PUSH P,[12]
	JRST SCOPE1


;TERMINAL TYPE VTS

.VTS:	PUSH P,[↑D43]
	PUSH P,[↑D72]
	PUSH P,[12]
	JRST SCOPE1

.TI:	PUSH P,[.TI1]
	PUSH P,[↑D66]
	PUSH P,[↑D79]
	PUSH P,[3]
	JRST SCOPE1
.TI1:	TLO Z,F1
	MOVEI C,1B31		;NO RAISE
	CALL CMOD
	CALL .FORMF		;NO FORMFEED (SIMULATE)
	TLZ Z,F1+F2
	MOVE D,[POINT 2,(E),17]
	CALL CCCOC		;REAL BACKSPACE
	RET
;.LWIDTH

;WIDTH OF TERMINAL LINE

.LWIDTH: NOISE (of line is)
	CALL DECIN
	JRST CERR
	ALLOW TSPC+TALT+TEOL
	CONFIRM
	CAILE A,177	;127. IS MAX
	MOVEI A,177
	MOVE C,A
	MOVE A,COJFN
	RFMOD
	DPB C,[POINT 7,B,17]
	STPAR
	RET
;.INDIC .INDI1 CCCOC CCCOCS

;INDICATE (FORMFEED)

.INDIC:	NOISE (formfeed)
	CONFIRM
.INDI1:	TLO Z,F2
	MOVE D,[POINT 2,(E),25]

;SUBR TO CHANGE CCOC BYTE TO SIMULATE (IF F1 ON & F2 OFF)
; OR SEND (IF F1 AND F2 OFF) OR INDICATE (IF F2 ON).
;BYTE TO CHANGE IS INDICATED BY A BYTE PTR IN D, INDEXED BY E.
;DESTROYS A, B, C, E.

CCCOC:	MOVE A,COJFN
	RFCOC
	MOVEI E,B
	CALL CCCOCS		;OPERATE ON CCCOC WORDS IN B,C
	MOVE A,COJFN
	SFCOC			;PUT NEW VALUE INTO EFFECT
	MOVEI E,ETTYMD+4	;OPERATE ON STORED VALUES
	CALL CCCOCS
	MOVEI E,PTTYMD+4

;SUBSUBROUTINE TO OPERATE ON BYTE IN WORDS E POINTS TO
CCCOCS:	MOVEI A,2		;2 = SEND CODE
	TLNE Z,F1
	MOVEI A,3		;3 = SIMULATE
	TLNE Z,F2
	MOVEI A,1		;1 = INDICATE BY ↑X
	DPB A,D
	RET
;.ACCES ACCES1 ACCES2 ACCE21 ACCES3 ACCES4 ACCE.T $ACCS1 $ACCS2

SUBTTL PDP-10 TENEX EXECUTIVE COMMANDS ROUTINES  ** X1CMD.MAC **

;ROUTINES TO DECODE AND EXECUTE SPECIFIC COMMANDS.
;DISPATCHED TO BY EXEC COMMAND INTERPRETER MAIN FILE (XMAIN.MAC).
;IN ALPHABETICAL ORDER BY COMMAND NAME.

;"ACCESS (TO FILES) <LIST> (BY) SELF,GROUP,OTHERS (IS) READ,WRITE,
;    EXECUTE,APPEND,PAGE-TABLE,UNUSED,ALL,NONE"

.ACCES:	NOISE <to files>
	CALL .INFG		;INPUT FILES LIST
	ALLOW TLPR!TALT!TSPC
	NOISE (by)
	PUSH P,[0]		;TEMP
ACCES1:	TLO Z,NEOLF		;SAY DON'T ECHO EOLS
	KEYWD $ACCS1
	 T OTHERS,COMOK!NSPALT,000077	;DEFAULT
	 JRST CERR
	ANDI KWV,-1		;FLUSH FLAGS
	IORM KWV,0(P)		;VALUE IS MASK
	ALLOW TCOM!TALT!TSPC
	TRNE CBT,TCOM		;SEPARATOR WAS COMMA?
	 JRST ACCES1		;COMMA, GET NEXT WORD

ACCES2:	ALTYPE ( )
	NOISE <is>
	PUSH P,[0]		;TEMP
ACCE21:	TLO Z,NEOLF
	KEYWD $ACCS2
	 T NORMAL,COMOK!EOLOK,52
	 JRST CERR
	ANDI KWV,-1		;FLUSH FLAGS
	CAIE KWV,0		;"NONE"
	CAIN KWV,52		;"NORMAL"
	 SETZM 0(P)		;CLEAR WHAT WAS SAID BEFORE
	IORM KWV,0(P)		;ACCUMULATE
	CALL SPRTR		;ANALYZE TERMINATOR
	 JRST ACCE21		;ANOTHER FIELD, PROCESS IT
	 JRST ACCE21		;COMMA, PROCESS NEXT FIELD
	CONFIRM			;EOL,  GO

ACCES3:	POP P,E
	IMULI E,010101
	POP P,F			;MASK

	MOVEI A,ACCE.T
	MOVEM A,ILIDSP		;SET TO CATCH BAD CHFDB

	CALL FRSTF		;TYPE FIRST FILE NAME
ACCES4:	HRRZ 1,@INIFH1		;GET JFN
	DVCHR
	TLNN 2,(1B4)		;DISK?
	 JRST [	ETYPE < %1H: does not have protected files
>
		JRST NEXTF]	;GET NEXT FILE, GO TO ACCES4
	MOVSI 1,FDBPRT		;PROTECTION WORD
	HRR 1,@INIFH1		;FORM INDEX,,JFN
	HRRZ 2,F		;ACCESS PATHS
	HRRZ 3,E		;PROTECTION
	TRNE 2,20000		;TRYING TO CHANGE THIS BIT TO 0?
	TROE 3,20000
	CAIA
	 TYPE < 20000 bit forced on
>
	HRLI 3,(5B2)		;MAKE IT NUMERIC
	CHFDB
	JRST NEXTF		;GET NEXT FILE, RETURN TO ACCES4


;CHFDB WILL TRAP TO HERE

ACCE.T:	SETZM ILIDSP		;CANCEL THE TRAPPER
	ERROR <Access violation>



$ACCS1:	TABLE
	T ALL,COMOK,777777
	T GROUP,COMOK,007700
	T OTHERS,COMOK,000077
	T SELF,COMOK,770000
	TEND


$ACCS2:	TABLE
	T ALL,COMOK!EOLOK,77
	T APPEND,COMOK!EOLOK,04
	T EXECUTE,COMOK!EOLOK,10
	T NONE,COMOK!EOLOK,00
	T NORMAL,COMOK!EOLOK,52
	T PAGE-TABLE,COMOK!EOLOK,02
	T READ,COMOK!EOLOK,40
	T UNUSED,COMOK!EOLOK!INVIS,01
	T WRITE,COMOK!EOLOK,20
	TEND
;.ACCOU ACCOU0 ACCOU1 ACCOU2 ACCOU3

;ACCOUNT (OF FILE) <NAME> (IS) <ACCOUNT # OR STRING>

REPEAT 0,<

.ACCOU:	NOISE <of files>
	CALL .INFG		;INPUT FILE GROUP

REPEAT 0,<	;SEE IF TARGET DIRECTORY SPECIFIES STRING OR NUMBER
ACCOU0:	MOVE A,CSBUFP
	MOVE B,CJFN1
	HRLZI C,B5		;DIRECTORY NAME ONLY, UNPUNCTUATED.
	JFNS			;GET STRING FOR DIRECTORY NAME>

REPEAT 1,<	;SEE IF USER SPECIFIES STRING OR NUMERIC ACCT
ACCOU1:	GJINF
	MOVE B,A		;USER'S LOGIN DIRECTORY
	MOVE A,CSBUFP
	DIRST
	 CALL SCREWUP>


ACCOU2:	MOVEI A,1
	MOVE B,CSBUFP
	STDIR			;CONVERT BACK TO GET LEFT HALF BITS
	 JRST CERR
	 JRST CERR
	ALLOW TSPC!TALT!TLPR!TEOL
	NOISE <is>
	CALL ACCT		;GET ACCOUNT NUMBER OR STRING, USING A.
	MOVE E,A		;SAVE THRU DVCHR'S
	CONFIRM
	CALL FRSTF		;PRINT NAME OF FIRST FILE IN GROUP

ACCOU3:	HRRZ 1,@INIFH1		;GET THE JFN
	DVCHR
	HLRZS 1
	CAIE 1,600000		;DEVICE IS DSK: ?
	 JRST [	UTYPE [ASCIZ / not a disk file/]
		JRST NEXTF]	;DO NEXT, RETURN TO ACCOU3
	HRRZ 1,@INIFH1		;JFN
	MOVE 2,E		;ACCOUNT
	SACTF			;SET ACCOUNT OF FILE
	 CALL [	CAIN 1,SACTX4
		 UERR [ASCIZ /No access to change account of that file/]
		JRST SCREWUP]
	JRST NEXTF		;GNJFN, TYPE NAME, GO TO ACCOU3
>;REPEAT 0

;APPEND" IS WITH "COPY" IN X2CMD.MAC.
;.ADVIS

;ADVISE (USER) <USERNAME OR TERMINAL NUMBER>

REPEAT 0,<

.ADVIS:	NOISE (user)
	CALL TTYNUM
	MOVEI 1,400000(1)	;FORM TTY DESIGNATOR
	TLO 1,(1B1)		;SET "ADVISE TO" FLAG
	ADVIZ
	 CALL [	CAIN 1,ADVX4
		 ERROR <Only one advise link is permitted>
		CAIN 1,ADVX2
		 ERROR <ingored>
		CAIN 1,ADVX1
		 ERROR <refused>
		JRST JERR]
	RET
>
;.ASSIG

;ASSIGN <DEVICE> (AS) <LOGICALNAME>

.ASSIG:	NOISE (device)
	CALL DEVN		;READ DEVICE NAME, CHECK IT.
				;ACCEPTS USUAL TERMINATORS, PLUS COLON
	PUSH P,A		;...RETURNS DEV DESGNATOR IN A,
	PUSH P,B		;...CHARACTERISTICS IN B,
				;...JOB # ASS TO IN C.
	TLNN B,B3
	ERROR <%1H: cannot be assigned>
	TLNN B,B5		;"AVAILABLE" BIT
	JRST [	TLNN B,B6	;NOT AVAIL, ASSIGNED?
		UERR [ASCIZ /%1H: not available/]	;%H: DEV NAME
		UERR [ASCIZ /%1H: already assigned to job %3Q/]]
	TLNE B,B6
	$TYPE < [Already assigned to you] >;  ADVISORY MSG, NOT ERROR
	LDB C,[POINT 9,A,17]
	CAIN C,12		;DEVICE TYPE TTY?
	JRST [	MOVEI E,(A)	;MASK TTY #
		GJINF		;JOB'S CONT TTY # TO D
		CAMN D,E
		UERR [ASCIZ /You can't assign your controlling terminal/]
		;DVCHR B5 & B6 CLEAR FOR TTY THAT IS ANOTHER JOB'S
		; CONTROLLING TTY. 11/25/70.
		MOVE A,['TTYJOB']
		CALL $SYSGT	;GET # OF TABLE OF TTYS
		HRR A,B		;TABLE #
		HRL A,E		;TTY # IS TABLE INDEX
		GETAB		;GET TABLE WORD
		 CALL JERR
		HLRZ C,A
		MOVE A,-1(P)	;DEV DESIG FOR ERROR MESSAGES
		CAIN C,-1
		JRST .+1	;TTY IS FREE IF -1 IN LH TBL WD
  JUMPG C,[UERR [ASCIZ /%1H: is the controlling terminal for job %3Q/]]
						;POSITIVE: JOB #
		UERR [ASCIZ /%1H: busy/]]	;-2: BEING ASSIGNED
				;B0+JOB # ASSIGNED TO ALSO GETS THIS
				;IF FOR SOME REASON ABOVE CHECKS FAIL.
	SETZ B,			;INDICATES NO SYNONYM
	TRNE CBT,TEOL
	JRST ASSIG3		;CR, NO SYNONYM FIELD
	NOISE <as>
;ASSIG3 ASSIG5

;ASSIGN...
;NEXT FIELD, IF NOT NULL, IS LOGICAL NAME (SYNONYM).
	TLO Z,PUNCF
	CALL CSTR
	CAIG CNT,1
	JRST [	TLO Z,BAKFF		;NULL, NO LOG NAME. B 0.
		JRST ASSIG3]
		;MAKE SURE THE STRING IS NOT ALREADY A SYNONYM
		;(ACCEPT PHYSICAL DEVICE NAMES).
	CALL BUFFF		;OR IS .BFP OK?
	MOVE B,A
	CAIN TRM,ALTM
	CALL UBP
	ALTYPE <:>
	ERROR <Synonyms not implemented yet>; ←←←←←←← 8/28/70
ASSIG3:	CONFIRM
	POP P,A		;DEVICE CHARACTERISTICS
	TLNN A,B7		;"MOUNTABLE" BIT
	JRST ASSIG5		;NOT MOUNTABLE
	MOVE A,(P)		;DEVICE DESIGNATOR
		;TLO A,B3	;SAY DON'T READ DIRECTORY
	MOUNT		;MIGHT BE NEEDED TO INVALIDATE DIR IN CORE ←←←←
	 CALL JERR
ASSIG5:	MOVE A,(P)		;DEVICE DESIGNATOR
	ASND
	 CALL JERR
	POP P,A		;DEVICE DESIG AGAIN
	JUMPE B,.+3		;B CONTAINS 0 OR LOGICAL NAME PTR
	CSYNO
	 CALL JERR
	JRST CMDIN4

;.ATTAC

;ATTACH (USER) <NAME> (PASSWORD) -- (TSS JOB #) <#>

;LIKE LOGIN, THIS COMMAND ALSO ACCEPTS THE FORM:
;ATTACH
;(USER) <NAME>
;(PASSWORD) ----
;(TSS JOB #) <#>

;PASSWORD IS NOT ECHOED IN FULL DUPLEX, TYPED OVER MASK ON
;FOLLOWING LINE IN HALF DUPLEX.
;TSS JOB # CAN BE OMITTED IF THERE IS ONLY ONE JOB FOR GIVEN USER.
;IF NOT LOGGED IN, CURRENT JOB GOES AWAY (HANDLED BY MONITOR),
;IF LOGGED IN IT IS DETACHED.

.ATTAC:	CALL SPECEOL		;SPECIAL HANDLING OF EOL TERMINATOR FOR 
				;OPTIONAL FANCY FORMAT.
	NOISE <user>
	CALL USERN		;INPUT USER (DIRECTORY) NAME
	TLNE A,B0
	ERROR <That's a files-only directory name>
	MOVEI A,(A)		;MASK DIR #
	PUSH P,A		;SAVE DIR #
	CALL SPECEOL		;CHECK TERMINATOR & HANDLE EOL SPECIALLY
	HRRZ A,0(P)		;DIRNUM
	CALL PASWD		;INPUT AND CHECK PASSWORD (USES A)
	PUSH P,A		;SAVE PASSWORD STRING POINTER
	NOISE <Tenex job #>
	INHELP <
 Number if you have more than one job>
	ALLOW TALT+TSPC+TEOL
	CAIN CNT,2
	JRST [	MOVE B,.BFP
		ILDB B,B
		CAIN B,"-"
		JRST ATTAC5	;NULL INDICATED WITH "-"
		JRST .+1]
	TLO Z,BAKFF
	CALL DECIN
	JRST [	UALTYP [ASCIZ /-/]	;NULL. TYPE "-" ON ALT MODE.
		JRST ATTAC5]
	PUSH P,A		;SAVE JOB # INPUT BY USER
;ATAC4B

;ATTACH...
;CHECK THAT USER-GIVEN JOB # IS IN LEGAL RANGE
	SETO D,
	GTB 3		;GET MAX JOB # AS LENGTH OF SYSTEM TABLE 3
	MOVN A,A		;LENGTH COMES BACK NEGATIVE
	SUBI A,1		;SO VALUE COMES OUT RIGHT IN ERR MSG
	CAML A,(P)		;LENGTH MUST BE > GIVEN #
	SKIPGE D,(P)		;GIVEN JOB # TO D
	ERROR <Tenex job # must be between 0 and %1Q>

;MAKE SURE GIVEN JOB # IS LOGGED IN W MATCHING DIR # AND IS ATTACHED

	GTB 1			;ENTRY NEG IF NO SUCH JOB
	JUMPL A,[UERR[ASCIZ/No job %4Q/]]
	GTB 0			;LINE # OR NEGATIVE FOR DETACHED IN LH
	JUMPL A,ATAC4B
	HLRZ A,A		;TTY #
	ETYPE < [Attached to TTY%1O]>
	TLO KWV1,CONMAN		;REQUIRE CONFIRMATION IN THIS CASE
ATAC4B:	GTB 3			;LOGIN DIR NO IN RH
	MOVEI A,(A)		;MASK DIR NO UNDER WH THIS JOB IS LOGGED IN
	JUMPE A,[UERR [ASCIZ /Job %4Q not logged in/]]
	MOVE E,-2(P)		;DESIRED DIRECTORY #, FOR USE IN ERR MSG
	CAME A,E
	ERROR <Job %4Q not logged in under %5R>
	JRST ATTAC7		;GO CONFIRM AND EXECUTE
;ATTAC5 ATA5A ATA5B ATA5C

;ATTACH...
;NO JOB # GIVEN, SEE IF THERE IS A UNIQUE ONE FOR GIVEN NAME.

ATTAC5:		;SEARCH SYSTEM TABLE 3 FOR A MATCH
	MOVE E,-1(P)		;DIR # TO SEARCH FOR (USED IN ERR MSGS!)
	SETO D,
	GTB 3		;SYSTEM TABLE 3: BY JOB #, LOGIN DIR # IN RH.
	HRLZ D,A		;SET UP LENGTH,,INDEX FOR AOBJN & GTB.
ATA5A:	GTB 3
	MOVEI A,(A)		;MASK THIS JOB'S LOGIN DIR #
	CAME A,E
ATA5B:	JRST [	AOBJN D,ATA5A		;LOOP ENDTEST
		UERR [ASCIZ /No detached job logged in under %5R/]]
	GTB 0
	JUMPGE A,ATA5B		;IGNORE NON-DETACHED JOBS
		;FOUND ONE, SEE IF ITS THE ONLY ONE.
	MOVEI B,(D)
	PUSH P,B		;SAVE JOB # OF JOB FOUND
ATA5C:	AOBJP D,ATTAC7		;IF END OF TABLE, GO CONFIRM AND EXECUTE
	GTB 3
	MOVEI A,(A)
	CAME A,E
	JRST ATA5C
	GTB 0
	JUMPGE A,ATA5C		;IGNORE NON-DETACHED JOBS
	ERROR <Tenex job # required - %5R has more than one detached job>
;ATTAC7

;ATTACH...

ATTAC7:	CONFIRM
;EXECUTE THE COMMAND
;IF LOGGED IN, TYPE JOB # OF THIS JOB
	GJINF
	JUMPLE A,.+2
	ETYPE < Detaching job # %3Q
>
;ATTACH
	POP P,A		;TSS JOB # TO ATTACH TO
	POP P,C		;PASSWORD STRING POINTER
	POP P,B		;RH: DIR # TO ATTACH TO
		;B0 OFF SAYS DON'T STOP IT
	ATACH
	 CALL [	CAIN A,ATACX4
		UERR [ASCIZ /Incorrect password/]
		;NOTE THAT BAD PASSWORD IS DETECTED ABOVE
		;IF NOT LOGGED IN
		JRST JERR]
		;THIS JOB CONTINUES RUNNING IF LOGGED IN.
	GJINF		;GET TSS JOB # IN A
	JUMPG A,CMDIN4		;LOGGED IN, GO GET NEXT COMMAND
		;NOT LOGGED IN, ATACH FAILED TO KILL JOB, DO SO IN EXEC.
	SETO A,		;SAY SELF
	LGOUT		;KILL JOB
	 CALL JERR		;LGOUT FAILED
;.AVAIL $AVAIL ..TERM TERMI1 TERMI9 EOLRET .PTYS .PTY1 .PTY2 .PTY3 .NVTS TERMY1 TERMY9

;AVAILABLE [LINES/DEVICES]

.AVAIL:	KEYWD $AVAIL
	 T LINES,EOLOK,..TERM
	 JRST CERR
		;CAN'T CONFIRM HERE BECAUSE OF FUDGE-ENTRIES IN TABLE
	JRST (KWV)

$AVAIL:	TABLE
	T DEVICES,EOLOK
	T LINES,EOLOK,..TERM
	T NVTS,EOLOK
	T PTYS,EOLOK
	T T,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /ERMINALS /]
				JRST ..TERM]>	;"T" = "TERMINALS"
	T TE,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /RMINALS /]
				JRST ..TERM]>
	T TELETYPES,EOLOK+INVIS,..TERM
	T TERMINALS,EOLOK+INVIS,..TERM
	T TTYS,EOLOK+INVIS,..TERM
	T VTYS,EOLOK+INVIS,.PTYS
	TEND

;AVAILABLE TERMINALS

..TERM:	CONFIRM
	SETO D,		;WORD -1 OF A TABLE IS ALWAYS LENGTH
	GTB 4		;SYSTEM TABLE 4 IS LINE STATUSES
	HRLZ D,A		;D IS AOBJN COUNT,,LINE #
		;TLZ Z,F1	;CLEAR TO SAY NOTHING PRINTED YET
TERMI1:	GTB 4		;LINE # = TABLE INDEX. GET A LINE'S STATUS.
	HLRZ A,A		;LEFT HALF OF TABLE WORD
	CAIE A,-1		;IS -1 FOR FREE LINES
	JRST TERMI9
	CALL BEFORE		;TYPE COMMA OR MAYBE EOL
		;TYPE <Line >;	;DESIREABLE?
	HRRZ B,D
	CALL TOCT		;TYPE LINE NUMBER
TERMI9:	AOBJN D,TERMI1
	TLNN Z,F1
	TYPE < All lines in use>
EOLRET:	PRINT EOL		;COME HERE TO TYPE CRLF AND POPJ.
	RET

.PTYS:	CONFIRM
	MOVE A,[SIXBIT /PTY/]
	SYSGT
	MOVE D,A
	SKIPN B
	 ERROR <No PTY table>
.PTY1:	GTB 4
	HLRZ A,A
	CAIE A,-1
	 JRST .PTY2
	CALL BEFORE
	HRRZ B,D
	CALL TOCT
.PTY2:	AOBJN D,.PTY1
.PTY3:	TLNN Z,F1
	 TYPE < All lines in use>
	JRST EOLRET

.NVTS:	CONFIRM
	SETO D,		;WORD -1 OF A TABLE IS ALWAYS LENGTH
	GTB 4		;SYSTEM TABLE 4 IS LINE STATUSES
	HRLZ D,A	;D IS AOBJN COUNT,,LINE #
	ADD D,[11,,11]	;SKIP OVER REAL TTYS
	MOVE A,[SIXBIT /PTY/]
	SYSGT
	SKIPN B
	 ERROR <No PTY table>
	HLRE A,A
	MOVN A,A
	HRL A,A
	ADD D,A		;SKIP OVER PTYS
		;TLZ Z,F1	;CLEAR TO SAY NOTHING PRINTED YET
TERMY1:	GTB 4		;LINE # = TABLE INDEX, GET A LINE'S STATUS.
	HLRZ A,A	;LEFT HALF OF TABLE WORD
	CAIE A,-1	;IS -1 FOR FREE LINES
	 JRST TERMY9
	CALL BEFORE	;TYPE COMMA OR MAYBE EOL
		;TYPE <Line >;	;DESIRABLE?
	HRRZ B,D
	CALL TOCT	;TYPE LINE NUMBER
TERMY9:	AOBJN D,TERMY1
	TLNN Z,F1
	TYPE < All line in use>
	JRST EOLRET
;.DEVIC BEFORE

;AVAILABLE DEVICES
;DOES NOT LIST TTYS OR ANY NON-ASSIGNABLE DEVICES
;THIS LEAVES DTAS, MTAS, PTP, PTR, AND ANY OTHER DEVICES ADDED LATER.
;ALSO LISTS SEPARATELY DEVICES ALREADY ASSIGNED TO THIS JOB.

.DEVIC:	CONFIRM
		;TLZ Z,F1	;SAY NOTHING TYPED YET
		;"DEVLUP" EXECUTES THE NEXT LOC FOR EACH DEVICE, WITH
	CALL DEVLUP		;...NAME IN A, DVCHR WORD IN B.
	 CALL [	JUMPGE C,[RET]		;DONE IF ASSIGNED WITH ASND.
		TLNN B,B3		;DONE IF NOT ASSIGNABLE
		RET
		LDB B,[POINT 9,B,17]		;EXTRACT DEVICE TYPE
		CAIN B,12		;EXCLUDE TTYS ALSO
		RET
		CALL BEFORE		;SEPARATING CHARACTER(S)
		JRST SIXPRT]		;PRINT SIXBIT NAME
	TLNE Z,F1
	PRINT EOL
	JRST ASTTJ		;LIST DEVS ASSIGNED TO THIS JOB. WITH FILSTAT.

;SUBROUTINE FOR FORMATTING A LIST OF ITEMS SEVERAL TO A LINE.
;USED FOR AVAILABLE TERMINALS, AVAILABLE DEVICES, AND FILSTAT.
;BEFORE EACH ITEM: COMMA EXCEPT CRLF IF TOO FAR TO RIGHT.

BEFORE:	PUSH P,A
	PUSH P,B
	MOVE A,COJFN
	RFPOS
	MOVEI B,(B)		;MASK COLUMN POSITION
	CAIL B,↑D65
	JRST [	PRINT EOL
		JRST .+3]
	TLOE Z,F1		;SUPPRESS COMMA BEFORE FIRST ONE
	PRINT ","
	PRINT " "		;SPACE AFTER COMMA OR EOL
	JRST [	POP P,B
		POP P,A
		RET]
;DEVLUP DEVL1 SIXPRT SIXPR1

;SUBROUTINE TO LOOP OVER ALL DEVICES FOR "AVAIL DEVICES" AND "FILSTAT".
;FOR EACH DEVICE, EXECUTES LOCATION AFTER CALL WITH SIXBIT NAME IN A
;    DEVICE CHARACTERISTICS WORD (A LA "DVCHR" EXCEPT B5) IN B,
;    -1 OR JOB # ASSIGNED TO IN C.
;RETURNS +2.
;DESTROYS A, B, C, D.

DEVLUP:	SETO D,
	GTB 6		;GET # DEVICES FROM TABLE 6
	HRLZ D,A		;AOBJN COUNT,,ABLE INDEX
DEVL1:	GTB 7		;GET DEVICE CHARACTERISTICS WORD FROM TABLE 7
	MOVE B,A
	GTB 10		;GET JOB # ASS TO, OR -1, FROM LH TABLE 8
	HLRE C,A
	GTB 6		;GET DEVICE NAME IN SIXBIT FROM TABLE 6
	PUSH P,D
	XCT @-1(P)
	POP P,D
	AOBJN D,DEVL1
	JRST [	AOS (P)
		RET]

;TYPE SIXBIT SYMBOL FROM A.
;USED IN "AVAILABLE DEVICES", "SYSTAT", "STATISTICS", AND "FILSTAT".

SIXPRT:	PUSH P,B
	PUSH P,C
	MOVE C,A
SIXPR1:	SETZ B,
	LSHC B,6
	ADDI B,40
	CALL CCHRO
	JUMPN C,SIXPR1
	JRST [	POP P,C
		POP P,B
		RET]
;.BREAK BREAK1 BREAK3

;BREAK (LINKS)

.BREAK:	NOISE <links>
BREAK1:	CONFIRM
	INTOFF
	HRLOI 1,(1B0+1B1)	;BREAK TO AND FROM CONTROLLING
	JRST BREAK3


;;BREAK2 IS CALL BY ↑ECREATE AND ↑EPRINT
;
;BREAK2:	INTOFF			;BE SURE TO DO BOTH TLINK AND ADVIZ
;	HRLOI 1,(1B0+1B1+1B4)	;BREAK TO AND FROM CONTROLLING
BREAK3:	MOVEI 2,-1		;ALL REMOTES, AND "REFUSE"
	TLINK
	 CALL JERR
;	MOVSI A,(1B0)		;BREAK ADVISE LINKS
;	ADVIZ
;	 CALL JERR
	INTON
	RET
;.CHANG $CHANG C.PSWD C.PSW0 C.PSW1 C.PSWT

;"CHANGE" COMMAND

.CHANG:	KEYWD $CHANG
	 0
	 JRST CERR
	JRST 0(KWV)

$CHANG:	TABLE
;	T ACCOUNT,,C.ACCT
	T PASSWORD,,C.PSWD
	TEND


;;"CHANGE ACCOUNT (TO) ..."
;
;C.ACCT:
;;DETERMINE WHETHER LOGGED IN USER TAKES STRING OR NUMERIC ACCT
;..ACNT:	GJINF			;LOGIN DIR # TO A
;	MOVE B,A
;	MOVE A,CSBUFP		;STRING BUFFER PTR
;	DIRST			;CONVERT DIR # TO STRING
;	 CALL SCREWUP
;	MOVEI A,1
;	MOVE B,CSBUFP
;	STDIR			;CONVERT BACK TO # PLUS BITS
;	 CALL SCREWUP
;	 CALL SCREWUP
;;NOW B1 OF A ON FOR STRING ACCT. FINISH INPUTTING COMMAND.
;	TLNN A,B1		;NOISE DEPENDS ON WHETHER USER TAKES...
;	NOISE <# to>		;NUMERIC ACCOUNT,
;	TLNE A,B1
;	NOISE <to>		;OR STRING.
;	CALL ACCT		;INPUT, CHK, CNVT ACCT INTO A (USES A )
;	CONFIRM
;	CALL PIE.P		;SKIP IF PIESLICE SYSTEM
;	 JRST C.ACC2
;	PUSH P,A		;SAVE NEW ACCOUNT
;	ADD P,[10,,10]		;NO CHECK FOR POV ←←←←←
;	MOVEI A,-7+0(P)		;WHERE TO PUT STRING ACCT
;	SETO B,			;SAY THIS JOB
;	GACTJ			;GET CURRENT ACCOUNT
;	 CALL JERR
;	ETYPE < Time used on account %1M: %B in %C>
;	SUB P,[10,,10]
;	POP P,A			;NEW ACCOUNT
;	JRST C.ACC3
;
;C.ACC2:	ETYPE < Time used on previous account: %B in %C>
;
;C.ACC3:	SETZ B,			;NO SPECIAL FUNCTION BITS
;	CACCT			;JSYS TO CHANGE ACCOUNT #
;	 CALL JERR
;	RET
;




;"CHANGE PASSWORD (OF DIRECTORY) ... (FROM PASSWORD) ... (PASSWORD) ... (PASSWORD) ... "

C.PSWD:;	CALL BREAK2		;DO "BREAK" AND "REFUSE"
	CALL SPECEOL		;MAKE EOL FORCE NOISE
	NOISE <of directory>
	CALL DIRNAM		;INPUT AND CHECK DIRECTORY NAME
	PUSH P,A		;BITS,,# FROM STDIR
	PUSH P,B		;POINTER TO BUFFERED NAME STRING
	ALLOW TSPC+TALT+TEOL
	ALTYPE ( )
	CALL SPECEOL
	ANDI A,-1		;KEEP ONLY DIR NUM
	MOVNS A			;SPECIAL NOISE & CHECK IT
	CALL PASWD		;INPUT AND CHECK PASSWORD
	PUSH P,A		;SAVE POINTER TO IT
	ALLOW TSPC+TALT
	SETZ A,			;SAY DON'T CHECK PASSWORD
	CALL PASWD		;INPUT NEW PASSWORD
	PUSH P,[0]		;CRDIR BLOCK BEGINS HERE
	PUSH P,A		;SAVE POINTER TO IT
	ALLOW TSPC+TALT
	SETZ A,			;SAY DON'T CHECK PASSWORD
	CALL PASWD		;INPUT NEW PASSWORD AGAIN
	MOVE C,0(P)		;GET POINTER TO FIRST NEW PASSWORD
C.PSW0:	ILDB B,A		;GET CHARACTER FROM SECOND NEW PASSWORD
	ILDB D,C		;GET CHARACTER FROM FIRST NEW PASSWORD
	CAME B,D		;ARE THEY THE SAME?
	 JRST CERR		;NO - USER MADE A TYPO
	JUMPN B,C.PSW0		;YES - CHECK THE NEXT LETTER
	MOVE A,0(P)		;PASSWORDS MATCH - GET ORIGINAL STRING POINTER
	IBP A			;BECAUSE WE'VE ALREADY GOTTEN AT LEAST ONE CHARACTER
	CAMN A,C		;BETTER NOT BE A NULL PASSWORD
	 JRST CERR		;WILL BE HARD TO LOG IN IF PASSWORD IS NULL
	ALLOW TALT+TSPC+TEOL
	CONFIRM

C.PSW1:	MOVEI A,C.PSWT
	MOVEM A,ILIDSP		;SET TRAP RETURN FOR CRDIR
	MOVE 1,-3(P)		;POINTER TO OLD NAME
	MOVSI 2,(1B1)		;"SET PASSWORD" BIT
	HRRI 2,-1(P)		;PARAMETER BLOCK LOCATION (PARTIAL)
	MOVE 4,-2(P)		;NEW PASSWORD
	CRDIR
	 CALL JERR
	SETZM ILIDSP		;CANCEL ILLEGAL INSTR TRAP
	SUB P,[5,,5]		;FLUSH JUNK
	RET


;CRDIR TRAPS TO HERE

C.PSWT:	SETZM ILIDSP		;DISABLE TRAPPER
	CAIN 1,CRDIX1
	 ERROR <Ownership rights required>
	JRST ILIPSI
;.CLEAR

;CLEAR (DIRECTORY OF DEVICE) <DEVICE NAME>
;FORCED CONFIRMATION

.CLEAR:	NOISE <directory of device>
	CALL DEVN
	LDB D,[POINT 9,A,17]		;DEVICE TYPE
	CAIE D,3
	ERROR <DECtapes only>
	TLNN B,B5		;AVAILABLE?
	JRST [	TLNN B,B6		;ASSIGNED?
		UERR [ASCIZ /%1H: not available/]
		UERR [ASCIZ /%1H: assigned to job %3O/]]
	TLNN B,B8
	ERROR <%1H: not mounted>
	CONFIRM
	INIDR		;INITILIZE DIRECTORY (DESIGNATOR IN A)
	 CALL JERR
	RET
;.CLOSE .COMMA .CONNE CONNE4

;CLOSE (FILE) <OPEN FILE NAME>

.CLOSE:	NOISE <file>
	JRST NIYE		;←←←←←←←←←←←←←←←←←←←←←←←←← 

;COMMANDS (FROM FILE) <FILE NAME>

.COMMA:	NOISE <from file>
	JRST NIYE		;←←←←←←←←←←←←←←←←←←←←←←←←← 

;CONNECT (TO DIRECTORY) <NAME> (PASSWORD) --
;(IF A WAY IS PROVIDED TO FIND OUT WHETHER A GIVEN DIRECTORY
; REQUIES A PASSWORD, MAKE IT REQUEST PASWD ON NEXT LINE (LIKE LOGIN)
; INSTEAD OF ASSUMING NULL IF NAME IS TERMINATED WITH CR BUT THIS
; DIRECTORY REQUIRES A PASSWORD).

.CONNE:	NOISE <to directory>
	CALL DIRNAM		;INPUT & CHECK DIRECTORY NAME
	PUSH P,A		;DIR # ETC AS RETURNED BY "STDIR"
	ALTYPE ( )
	ALLOW TSPC+TALT+TEOL
;PASSWORD IS SECOND, OPTIONAL ARGUMENT
	HRROI A,[ASCIZ //]		;USE NULL IF OMITTED
	TRNE CBT,TEOL
	 JRST CONNE4
	HRRZ A,0(P)		;DIR NUM
	SKIPN LOCAL		;IS THIS A LOCAL TERMINAL?
	CALL PASWD		;NO - INPUT & CHECK PASSWORD
CONNE4:	ALLOW TALT+TSPC+TEOL
	CONFIRM
	PUSH P,A		;SAVE TEXT PTR TO PASSWD
	CALL CHKDAL		;CHECK CURRENT DIRECTORY BEFORE LEAVING
	POP P,B
	HRRZ A,(P)		;DIRECTORY #
	CNDIR
	 CALL [	CAIN A,CNDIX1
		UERR [ASCIZ /Incorrect password/]
		JRST JERR]
	CALL CHKDAL		;CHECK NEW DIRECTORY
	JRST CMDIN4
;$CONTI .CONTI ..CONT

;CONTINUE
;RESUMES FROZEN INFERIOR FORKS
;DECODE AND CHECK SUBROUTINE ALSO USED BY REDIRECT/DETACH

$CONTI:	SKIPGE FORK		;HANDLE OF AN INFERIOR FORK
	ERROR <No program>;		;NO INFERIORS AT ALL
;"FORK" SAYS WHETHER A FORK EXISTS, AND SAYS WHICH FORK "START" AND
;"REENTER" USE, BUT SINCE IT CAN BE CHANGED WITH "FORK" COMMAND
;IT MAY NOT BE THE RIGHT ONE TO CONTINUE.
	SKIPGE A,LRFORK		;HANDLE OF LAST RUN INFERIOR, IF ANY.
	ERROR <Program hasn't been run>;	NO FORK RUN SINCE RESET.
	RFSTS		;GET ITS STATUS (HANDLE IN A)
	TLNE A,077700		;DISTINGUISH -1 FROM 0-5,400000-400005
	ERROR <Program disappeared>;		;-1 = UNASSIGNED HANDLE.
;	JUMPGE A,[UERR [ASCIZ /Not interrupted/]]	;B0 MEANS FROZEN
	RET

;"CONTINUE" COMMAND DISPATCHES HERE

.CONTI:	CALL $CONTI
	CONFIRM
;"REDIRECT/DETACH ... (AND) CONTINUE" JOINS HERE

..CONT:	SETOM A
	CALL MAPPF		;UNMAP ANY PAGE OF USER
	MOVEI E,PTTYMD
	CALL LTTYMD		;LOAD USER'S TTY MODE
	TLO Z,RUNF		;SAY SO.
	MOVE A,LRFORK		;FORK WHICH RAN LAST
	RFSTS			;FIND OUT WHY IT STOPPED
	HLRZ 3,1
	TRZ 3,1B18		;FLUSH FROZEN BIT
	MOVE 1,LRFORK
	CAIE 3,2		;FORK WAS HALTED OR FORCE TERM?
	CAIN 3,3
	SFORK			;YES. START IT
	JRST WAIT		;GO RESUME FORK AND WAIT FOR IT

;"COPY" IS IN X2CMD.MAC.
;.DAYTI .DAYT1 .DAYT3 .DAYT5 .DAYT2 .DAYT4

;DAYTIME
;THIS AND ALL ONE-WORD COMMANDS ARE CONFIRMED BEFORE DISPATCH.

.DAYTI:	PRINT " "
	GJINF
	HRRZ D,A
	MOVEI A,1
	HRROI B,[ASCIZ /MRC/]	;WELL, <MGM> NO LONGER EXISTS AT CCA, AND
	STDIR			;THE HACK WAS THERE, SO I DECIDED I WANTED IT!!
	 JRST .DAYT1
	 JRST .DAYT1
	CAIN D,(A)
	 JRST .DAYT2
.DAYT1:	SETZM D
.DAYT3:	SETOM B
	ODCNV
	PUSH P,C
	MOVE A,COJFN		;DESTINATION
	SETOM E		;SUPER-VERBOSE
	ODTNC
	SETOM B
	MOVSI D,500000	;GMT
	ODCNV
	CAME C,(P)
	 JRST .DAYT4
	PRINT "	"		;SAME DAY
	MOVSI E,400020
.DAYT5:	MOVE A,COJFN
	ODTNC		;PRINT GMT ALSO
	PRINT EOL
	SUB P,[1,,1]
	RET

.DAYT2:	MOVSI D,100010	;PACIFIC TIME
	JRST .DAYT3

.DAYT4:	PRINT EOL	;DATE CHANGED, USE TWO LINE
	PRINT " "
	SETOM E
	JRST .DAYT5

;;DEFINE (NEW FILE) <NAME> (AS) <OLD OR NEW NAME>
;;DECODER ONLY -- NOT TO BE IMPLEMENTED IN MINISYSTEM.
;
;.DEFIN:	NOISE <new file>
;	HRROI A,		;NO DEFAULT EXTENSION FOR FIRST FILE
;	MOVEI B,B0+B1		;"FOR OUTPUT USE" AND "MUST BE NEW" BITS
;	CALL SPECFN		;GET FILE NAME USING GTJFN FLAGS IN B
;	 JRST CERR		;NO DEFAULT FOR "-" INPUT
;	NOISE <as>
;	MOVE A,[2,,2]	;SAY DEFAULT NAME AND EXT TO THOSE OF 1ST FILE
;	MOVEI B,B3		;SAY "TYPE OLD/NEW"
;		;THESE GTJFN BITS ACCEPT AN OLD OR NEW NAME BUT DEFAULT
;		;VERSION TO HIEST OLD RATHER THAN NEXT HIGHER AS "COUTFN" DOES.
;	CALL SPECFN
;	 JRST CERR
;	CONFIRM
;	JRST NIM		;TYPE "NOT IN MINISYSTEM"
;.DELET DELET0 DELET2 DELET3 DELET1

;DELETE <FILE GROUP>

.DELET:	MOVE A,[2,,2]		;SAY DEFAULT NAME & EXT TO PREVIOUS
	HRLI B,-2		;DEFAULT VERSION TO LOWEST
	HRRI B,B2+B11+B15+B16	;OLD FILE, *'S AND COMMA OK
	CALL SPECFN		;INPUT FILE GROUP DESCRIPTOR
	 JRST CERR
	ALLOW TSPC+TALT+TEOL
	CONFIRM
	CALL FRSTF		;TYPE NAME IF A GROUP

DELET0:	HRRZ A,@INIFH1		;JFN
	DVCHR
	TLNN B,(1B4)		;DISK?
	 JRST DELET1		;NO
	HRRZ A,@INIFH1

DELET2:	MOVE B,[1,,FDBCTL]	;GET CONTROL BITS
	MOVEI C,C		;TO C
	CALL $GTFDB		;GET FDB OR DON'T SKIP
	 ERROR <DELET2: GTFDB error>
	TLNE C,(FDBUND)		;CHECK THE PERPETUAL BIT
	 JRST [	UTYPE [ASCIZ / Cannot delete perpetual file
/]
		JRST NEXTF]	;DO NEXT FILE

DELET3:	MOVE B,[1,,FDBBCK]	;GET BACKUP WORD
	MOVEI C,C		;TO C
	CALL $GTFDB
	 ERROR <$GTFDB error>
	TLNE C,FDBARC		;ARCHIVE BIT
	 JRST [	UTYPE [ASCIZ / Cannot delete archive-pending file
/]
		JRST NEXTF]	;RETURNS TO FRSTF CALL +1

DELET1:	MOVE A,@INIFH1		;JFN(FLAGS TELL DELF WHETHER TO RELEASE)
	DELF
	 CALL [	CAIN A,DELFX1
		 UERR [ASCIZ /Protection violation/]
		JRST JERR]
	JRST NEXTF		;GET NEXT FILE IF GROUP, TYPE NAME,
				;RETURN TO WHERE FRSTF WAS CALLED.
				;GO TO RLJFNS IF NO MORE FILES.
;.DDT DDT1 DDT2

;"DDT" COMMAND. LOAD DDT IN INFERIOR FORK IF NECESSARY,
;TRANSMIT SYMBOL TABLE POINTER, START DDT.

.DDT:	SKIPGE DDTFLG		;DDT ALREADY LOADED?
	JRST DDT4		;YES

;DETERMINE WHETHER THERE IS INFERIOR FORK WITH SYMBOL TABLE POINTER
;IF NOT, USE DDT THAT ALREADY CONTAINS STENEX SYMBOLS.

	SETZ C,		;SAYS NO SYM TAB PTR
	SKIPGE FORK
	JRST DDT2		;NO FORK

;THERE IS A FORK, SEE IF IT ALREADY CONTAINS SOMETHING THAT LOOKS
;LIKE A DDT.  IF SO, LEAVE IT, AS IT MAY CONTAIN BREAKPOINTS,
;MODIFIED SYM TAB PTR, ETC.

	MOVEI A,DDTORG		;DDT BEGINNING ADDRESS
	CALL MAPPF
	TLNN A,B5		;PAGE EXISTS?
	JRST DDT1		;NO, FORK DOESN'T HAVE DDT
	CALL LOADF		;YES, LOAD FIRST WORD
	CAMN A,[JUMPA DDTORG+10]
	 JRST DDT3		;DATACOMPUTER HAS ITS OWN
	CAME A,[JRST DDTORG+2]
	JRST DDT1
	MOVEI A,DDTORG+1
	CALL LOADF		;SECOND WORD IS 0,,PTR PTR
	CAIG A,-1
	CAIG A,DDTORG
	JRST DDT1
	JRST DDT3		;ALREADY HAVE ACCEPTABLE DDT
;FORK DOESN'T HAVE DDT, SEE IF IT HAS SYM TAB PTR

DDT1:	MOVEI A,.JBSYM		;WHERE LOADER LEAVES SYM TAB PTR
	CALL MAPPF		;MAP PAGE OF FORK
		;SETZ C,	;SAYS NO SYM TAB PTR
	TLNE A,B5		;NO PAGE?
	TLNN A,B2		;READ PROTECT?
	JRST DDT2		;NO USEABLE PTR
		;ANDI A,777
	MOVE C,PAGEN(A)		;FETCH SYM TAB PTR WORD
		;IF NEGATIVE, IT WILL BE ASSUMED TO BE PTR
	MOVE D,PAGEN+1(A)	;.JBUSY IS .JBSYM+1
		;NO CHECKING NEEDED,  DDT WILL FIX IT UP.
DDT2:	PUSH P,C		;SAVE SYM TAB PTR OR 0
	PUSH P,D		;SAVE UNDEF SYM PTR
	MOVE B,[POINT 7,[ASCIZ /<SUBSYS>SDDT.SAV/]] ;DDT WITH SYMBOLS
	JUMPGE C,.+2		;SYM TAB PTR CANT BE .GE. 0
	MOVE B,[POINT 7,[ASCIZ /<SUBSYS>UDDT.SAV/]]
;LOAD SELECTED DDT
	CALL $GTJFN		;ASSIGN JFN FOR STRING PTR IN B
		;ENTRY TO "$LPT" SUBR NEAR "DIRECTORY"
	CALL $MERGE		;MERGE IT INTO FORK, CREATING FORK IF NONE,
		;AND RELEASE JFN
;DDT3 DDT4

;DDT...
;STORE SYMBOL TABLE POINTER

	POP P,D
	POP P,C
	JUMPGE C,DDT3		;NOT A SYMBOL TABLE POINTER
	MOVEI A,DDTSYM
	CALL MAPPF
	ANDI A,777
	HRRZ E,PAGEN+1(A)	;WHERE TO STORE UNDEF PTR
	HRRZ A,PAGEN(A)		;POINTER TO WHERE TO PUT POINTER
	CALL MAPPF
	ANDI A,777
	MOVEM C,PAGEN(A)		;STORE POINTER
	HRRZ A,E		;WHERE TO PUT UNDEF PTR IN DDT
	CALL MAPPF
	ANDI A,777
	MOVEM D,PAGEN(A)	;STORE IT
DDT3:	SETOM DDTFLG		;SAY DDT LOADED & SYM TAB PTR MOVED
;TRANSFER CONTROL TO DDT

DDT4:	MOVNI B,3		;CODE FOR PA1050 IF ANY
	CALL CHKPAT		;PA1050 RUNNING IN FORK?
	JUMPG B,GOTO2		;RETURNS RESTART ADDRESS IF YES
	MOVEI B,DDTORG		;DDT STARTS AT ITS FIRST LOCATION
	JRST GOTO2		;JOIN "GOTO" COMMAND: UNMAP PAGE, START FORK.
;.DEASS .DUMP

;DEASSIGN <DEVICE NAME>
;ACCEPTS LOGICAL OR REAL DEVICE NAME

.DEASS:	NOISE (device)
	CALL DEVN		;INPUT DEVICE NAME
		;NOW HAVE DEVICE DESGNATOR IN A, CHARACTERISTICS WORD IN B.
	TLNN B,B6
	ERROR <%1H: not assigned>
	TLNN B,B5
	ERROR <%1H: not assigned to you>
	CONFIRM
	TLNE B,B8		;MOUNTED?
	TLNN B,B7		;MOUNTABLE?
	JRST .+3		;NOT MOUNTED OR NOT MOUNTABLE
	DSMNT		;REDUCES CHANCES OF CLOBBEREING NEXT
	 CALL JERR		;...USER'S DECTAPE.
		;MAY ALSO WRITE DIRECTORY IN SOME CASES (?)
	RELD
	 CALL JERR
		;DO WE HAVE TO DO ANYTHING TO FLUSH SYNONYMS HERE?
	JRST CMDIN4

;"DETACH" CODE IS WITH "REDIRECT" BELOW.


;DUMP (ON) <FILE NAME>.
;SAVES ENVIRONMENT.
;CAN'T BE FULLY IMPLEMENTED TIL ENVIRONMENT SAVE FILES ARE SPECIFIED.

.DUMP:	NOISE <on>
	JRST NIYE		;←←←←←←←←←←←←←←←←←←←← 
;.EDIT EDIT1 EDIT2 EDIT3 EDIT4 EDIT5 EDIT6 EDIT7 EDIT8

;EDIT (FILE)

;FIRES UP TECO AT CCL ENTRY WITH JFN OF FILE SPECIFED IN AC1
; DEFAULT FILE IS MOST RECENT VERSION OF THE LAST ONE MENTIONED
; IN AN "EDIT" COMMAND.  THE ACTUAL NAME OF THIS IS SAVED AWAY IN
; "EDFILE" SO THAT IT IS PRESERVED THROUGH RESETS.

.EDIT:	CALL CEDFN		;GET EDIT FILE NAME,DEFAULT=PREVIOUS
	 JRST EDIT7		;NO FILE SPECIFIED
	PUSH P,A		;SAVE THE JFN FOR STARTING TECO
	CONFIRM

	MOVE A,[EDFILE,,EDFILE+1]
	SETZM -1(A)		;CLEAR DEFAULT POINTERS WORD
	BLT A,EDFILE+EDFILL	;AND SAVED STRINGS

EDIT1:	HRROI A,EDFILE+1	;BEG OF STRING STORAGE
	MOVE B,0(P)		;EDIT JFN
	HRLZM A,EDFILE		;SET NAME HALF OF POINTER WORD
	MOVSI C,(1B8)		;OUTPUT NAME OF JFN
	JFNS
	IBP A			;INSERT A NULL
	HRROI A,1(A)		;BUMP TO NEXT WORD
	HRRM A,EDFILE		;SET EXT HALF OF POINTER WORD
	MOVSI C,(1B11)		;OUTPUT EXT OF JFN
	JFNS

EDIT2:;	MOVE A,0(P)		;GET EDIT JFN AGAIN
;	MOVE B,[1,,FDBCTL]
;	MOVEI C,C		;INTO C
;	CALL $GTFDB		;GTFDB OR DON'T SKIP
;	 JRST CERR
;	TLNN C,(1B4)		;SEE IF FIRST WRITE HAS BEEN DONE
;	 JRST EDIT3		;IT HAS. DON'T CHANGE AUTHOR
;	MOVE B,[7B5+1B22]	;7-BIT, APPEND
;	OPENF			;MAKE SURE IT EXISTS
;	 JRST CERR
;	TLO A,(1B0)		;DONT RELEASE THE JFN
;	CLOSF			;TECO WILL OPEN IT
;	 CALL SCREWUP

EDIT3:	HRROI B,[ASCIZ /<SUBSYS>TECO.SAV/]
	CALL TRYGTJ		;GTJFN, STACK FOR RELEASE AT ERROR, ↑C
	 CALL CERR
	PUSH P,A		;SAVE FOR LATER

EDIT4:	CALL RESET		;FLUSH OLD FORK, IF ANY
	CALL ECFORK		;GET A CLEAN ONE
	MOVE A,['TECO  ']
	MOVEM A,SUBSYS
	SETZM PROPSF		;SET "GET2B"
	MOVEI B,GETILI		;SETUP TO CATCH
	MOVEM B,ILIDSP		;ILLEGAL GET JSYS
	POP P,A			;JFN ON TECO
	HRL A,FORK
	GET			;AND RELEASE JFN
	SETZM ILIDSP		;TURN OFF SPECIAL ILL INSTR HANDLING

EDIT5:	MOVEI A,1		;REFERENCE AC1
	CALL MAPPF
	POP P,PAGEN(A)		;JFN FOR TECO TO GOBBLE DOWN
	MOVE A,FORK
	MOVEI B,PAGEN
	SFACS			;MAPFF WON'T DO THIS

EDIT6:	MOVEI B,2		;CCL ENTRY
	JRST START1		;START UP THE TECO


EDIT7:	SKIPN A,EDFILE		;IS THERE A SAVED FILE NAME.EXT?
	CALL CERR		;NO
	MOVE B,[CJFNBK,,CJFNBK+1]
	SETZM -1(B)
	BLT B,CJFNBK+10		;CLEAR DEFAULT BLOCK

	HLROM A,CJFNBK+4	;DEFAULT NAME
	HRROM A,CJFNBK+5	;DEFAULT EXTENTION
	MOVE B,[377777,,377777]
	MOVEM B,CJFNBK+1	;NO IO
	MOVSI C,100000
	MOVEM C,CJFNBK+0	;OLD FILE ONLY, NO CONFIRM

EDIT8:	MOVEI A,CJFNBK		;DEFAULT BLOCK PTR
	MOVEI B,0		;FORCE DEFAULTING
	GTJFN
	 JRST [	SETZM EDFILE	;FORGET PAST FILE
		UERR [ASCIZ /Edit file has been deleted/]]
	MOVE B,JBUFP
	PUSH B,A		;SAVE FOR RELEASING ON ERROR,ETC
	MOVEM B,JBUFP
	PUSH P,A		;WHERE REST OF EDIT WANTS THE JFN
	CONFIRM
	JRST EDIT3		;FILE KNOWN TO EXIST, JUST GET TECO
;.ENTRY ENTRY5

;ENTRY (VECTOR LOCATION) <OCTAL> (LENGTH) <OCTAL>

.ENTRY:	SKIPGE FORK
	ERROR <No program>
	NOISE <vector location>
	CALL OCTAL
	 JRST CERR
	ALLOW TALT+TEOL+TSPC
	PUSH P,A
	MOVEI A,1		;DEFAULT LENGTH
	TRNE CBT,TEOL
	JRST ENTRY5
	NOISE <length>
	CALL OCTAL		;OCTAL TO ALLOW 254000 FOR COMPATIBILITY
	 JRST [	UALTYP [ASCIZ /1 /]		;NULL INPUT
		MOVEI A,1		;DEFAULT LENGTH AGAIN
		JRST .+1]
	ALLOW TALT+TEOL+TSPC
	CAILE A,777		;TOO LONG?
	JRST [	CAIN A,254000		;ALLOW JRST FOR COMPATIBLE
		JRST .+1
		JRST CERR]		;"?"
ENTRY5:	CONFIRM
	POP P,B		;LOCATION
	HRL B,A		;LENGTH
	MOVE A,FORK
	SEVEC
	RET
;.NOTEP .EPHEM

;"NOT EPHEMERAL"  TURNS OFF FDBEPH BIT IN FDB

.NOTEP:	TDZA 1,1		;0 FOR USE IN CHFDB


;"EPHEMERAL" TURNS ON THE FDBEPH BIT

.EPHEM:	SETOM 1			;1 FOR USE IN CHFDB
	PUSH P,1
	CALL $GET1		;GET A PROGRAM JFN, LIKE "GET" OR "RUN"
	ALLOW TSPC+TALT+TEOL
	CONFIRM
	MOVE 1,CJFN1		;JFN OF THE NAMED FILE
	DVCHR
	TLNN 2,(1B4)
	 ERROR <%1H doesn't have ephemerons>
	HRR 1,CJFN1
	HRLI A,FDBCTL		;FDB CONTROL BITS WORD
	MOVSI 2,(FDBEPH)
	POP P,3
	CHFDB
	JRST RLJFNS		;RELEASE JFN AND RETURN
;.EXEC EXEC1 .NEXEC

;'EXEC' - STARTS AN EXEC IN INFERIOR FORK SEPARATE FROM 'FORK'

.EXEC:	SKIPLE XFORK
	 JRST EXEC1
	MOVSI A,(1B2+1B17)
	HRROI 2,[ASCIZ /<SYSTEM>EXEC.SAV/]
	CALL TRYGTJ		;GTJFN AND SAVE IT
	 CALL JERR
	PUSH P,A
	MOVSI A,(1B1+1B3)
	MOVEI B,STRTAC		;TRANSMIT CAPS AND ACS
	CFORK
	 CALL JERR
	MOVEM A,XFORK
	POP P,A
	HRL A,XFORK
	GET
EXEC1:	TLNE Z,F1
	 JRST .NEXEC		;NO EXEC
	MOVE A,XFORK
	SETZM B
	SFRKV
	WFORK
	RET

.NEXEC:	INTOFF
	SETOM A
	EXCH A,XFORK
	SKIPLE A
	 KFORK
	 JFCL
	INTON
	RET
;.EXPUN $EXPUN ..EXAL ..EXDL ..EXPE ..EXSC ..EXTM ..EXPU

;EXPUNGE (DELETED FILES)

.EXPUN:	KEYWD $EXPUN
	 T ALL,EOLOK+LPROK,..EXAL
	 JRST CERR
	 JRST (KWV)

$EXPUN:	TABLE
	T ALL,EOLOK+LPROK,..EXAL
	T DELETED,EOLOK+LPROK,..EXDL
	T PERMANENT,INVIS+CONMAN+WHLUO+OPRUO+EOLOK+LPROK,..EXPE
	T SCRATCH,EOLOK+LPROK,..EXSC
	T TEMPORARY,EOLOK+LPROK,..EXTM
	TEND


..EXAL:	NOISE <deleted, scratch, and temporary files>
	HRLZI 1,(1B12!1B13!1B15!1B16)
	JRST ..EXPU

..EXDL:	NOISE <files>
	HRLZI 1,(1B12!1B13)
	JRST ..EXPU

..EXPE:	NOISE <files>
	HRLZI B,WHLUO+OPRUO
	CALL PRVCK		;SEE THAT REQUIRED CAPS ARE ENABLED
	HRLZI 1,(1B14)
	JRST ..EXPU

..EXSC:	NOISE <files>
	HRLZI 1,(1B15)
	JRST ..EXPU

..EXTM:	NOISE <files>
	HRLZI 1,(1B16)

..EXPU:	PUSH P,1
	ALLOW TSPC+TALT+TEOL
	CONFIRM
	GJINF
	HRR 1,2
	HLL 1,0(P)
	DELDF
	SUB P,[1,,1]
	RET
;.FORK FORK1 FORK2

;FORK <OCTAL FORK HANDLE>
;SETS FORK ACCESSED BY START, REENTER, GOTO, /, \, TEN50 DDT, SAVE.
;DOESN'T UPDATE SUBSYSTEM NAME (SUBSYS); MAYBE LATER IT SHOULD.

.FORK:	CALL OCTAL
	 JRST CERR
	ALLOW TALT+TSPC+TEOL
	TRO A,400000		;OK IF USER OMITS SIGN
	CAIN A,400000		;"SELF" IS LEGAL ONLY FOR WHEELS.
	JRST [	HRLZI B,WHLUO	;INDICATE WHEEL PRIV MUST BE ENABLED
		CALL PRVCK	;TEST SPECIAL CAPABILITIES
		 JRST FORK1	;NO ENABLE OR NO WHEEL CAPABILITY
		JRST FORK2]
	CAIL A,400001
	CAILE A,400017
FORK1:	ERROR <Fork handle must be between 1 and 17>
FORK2:	PUSH P,A
	RFSTS			;SEE IF THIS FORK HANDLE IS ASSIGNED.
	TLNE A,077700		;DISTINGUISH -1 FROM 0-5, 400000-400005.
	ERROR <No such fork>	;-1 = UNASSIGNED HANDLE.
	CONFIRM
	POP P,FORK		;SAVE HANDLE FOR OTHER COMMANDS TO USE
	JRST CMDIN4
;.MERGE $MERGE $GET1 $GET11

;MERGE <FILE> COMMAND.
;GETS A FILE INTO CURRENT FORK WITHOUT RESETTING.
;PUTS BACK ENTRY VECTOR WORD THAT WAS THERE BEFORE COMMAND

.MERGE:	CALL $GET1		;INPUT PROGRAM NAME
	ALLOW TSPC+TEOL+TALT
	CONFIRM

;SUBROUTINE ENTRY FOR "DDT" COMMAND. JFN IN CJFN1.
$MERGE:	SKIPGE A,FORK		;SKIP IF EXEC HAS INFERIOR FORK
	JRST $GET2		;CREATE FORK, GET PROG, USE ITS ENTRY.
	GEVEC			;ALREADY HAVE A FORK
	PUSH P,B		;SAVE SAME
	CALL $GET2		;GET PROGRAM
	POP P,B			;PREVIOUS ENTRY VECTOR
	MOVE A,FORK		;FORK HANDLE AGAIN
	JUMPE B,.+2		;JUMP IF THERE WAS NO ENTRY VECTOR WD
	SEVEC			;SET ENTRY VECTOR TO OLD VALUE
	RET


;SUBROUTINE TO INPUT A PROGRAM NAME.
;FIRST PART OF GET, RUN, MERGE.
$GET1:	NOISE (file)
$GET11:	SETZ A,			;SAY DEFAULT TO CONNECTED DIRECTORY
	CALL CPFN		;INPUT PROGRAM NAME AND ASSIGN JFN
	 JRST [	TRNE CBT,TEOL	;FAIL.
		JRST CERR	;AFTER CR TYPE "?" AND ABORT COMMAND.
		UTYPE [ASCIZ /? /] ;OTHER TERMINATORS, " ? " AND RETRY.
		MOVE BFP,.BFP	;BACK UP COMMAND BUFFER POINTER
		BTCHER		;STOP IF NON-INTERACTIVE
		JRST $GET11]	;GO RETRY.
	RET
;.ERUN ERUN0

;ERUN <FILE> COMMAND = RUN PROGRAM AS AN EPHEMERON

.ERUN:	NOISE (file)
ERUN0:	CAIE CHR,"<"		;WAS DIRECTORY SPECIFIED?
	 TLO Z,F3		;NO - DO DEFAULT SEARCHES THROUGH CONNECTED & LOGIN
	MOVEI A,[ASCIZ /SUBSYS/]	;DEFAULT DIRECTORY NAME
	CALL CPFN		;INPUT PROGRAM NAME AND ASSIGN JFN
	 JRST [	TRNE CBT,TEOL	;FAIL.
		JRST CERR	;AFTER CR TYPE "?" AND ABORT COMMAND.
		UTYPE [ASCIZ /? /] ;OTHER TERMINATORS, " ? " AND RETRY.
		MOVE BFP,.BFP	;BACK UP COMMAND BUFFER POINTER
		BTCHER		;STOP IF NON-INTERACTIVE
		JRST ERUN0]	;GO RETRY.
	 JFCL			;HOW MANY RETURNS DOES THIS THING REALLY HAVE?
	JRST CIN4A
;.RUN .GET GET1

;RUN <FILE> COMMAND = GET + START

.RUN:	PUSH P,[..STRT]		;SET RETURN TO JOIN "START" COMMAND,
				;FALL INTO "GET".



;GET <FILE> COMMAND.
;RESETS THEN CREATES ONE FORK AND GETS PROGRAM INTO IT.
;CODED IN SUBROUTINES SO CODE CAN BE SHARED WITH "MERGE".

.GET:	CALL $GET1		;INPUT PROGRAM NAME

;<SUBSYSTEM NAME> JOINS HERE AFTER CALLING CPFN AND SETTING
; RETURN TO JOIN START COMMAND (..STRT).
GET1:	ALLOW TSPC+TEOL+TALT
	CONFIRM
	CALL RESET		;CLOSE FILES, KILL ALL INFERIOR FORKS.
				;NOW FALL INTO $GET2, WHICH WILL RETURN
				;TO COMMAND INPUT FOR "GET" BECAUSE
				;DISPATCH WAS WITH "PUSHJ".
;$GET2 GET2B GETILI

;GET...
;SUBROUTINE TO GET A PROGRAM INTO CURRENT FORK, FOR GET, RUN, AND MERGE.
;AT ENTRY CJFN1 MUST CONTAIN JFN OF FILE TO GET.

$GET2:	SKIPL FORK		;IS THERE A FORK?
	JRST GET2B		;YES (HAPPENS FOR "MERGE")
	CALL ECFORK		;CREATE A FORK
	MOVE B,CJFN1		;JFN
	CALL SUBNAM		;SUBSYS NAME TO CELL "SUBSYS",
				;FOR USE WHEN FORK IS RUN (LTTYMD)
GET2B:	SETZM PROPSF		;"PROPRIETARY" FLAG, MAY BE SET IF
				;APPROPRIATE
			;NOW WHAT? TEST FILE'S PROTECTION? ←←←←← 
	MOVEI A,GETILI		;SET SPECIAL IL INST TRAP DISPATCH
	MOVEM A,ILIDSP		;SO "GET" ERRORS CAN BE DETECTED
	HRR A,CJFN1
	HRL A,FORK
	GET
	SETZM ILIDSP		;CLEAR IL INST SPECIAL DISPATCH ADDRESS
	CALL RLJFNS		;RELEASE JFNS
			;ANYTHING ELSE?
	RET



;ILLEG INST TRAP DURING GET JSYS
;TYPE EXEC ERROR MESSAGES FOR CERTAIN ERRORS

GETILI:	PUSH P,A
	MOVE A,ERCOD		;SYSTEM ERROR CODE
	CAIN A,GETX1
	ERROR <Bad core save file format>
	CAIN A,GETX2
	ERROR <System special pages table full>
	CAIN A,OPNX3
	ERROR <Program protected>
	POP P,A
	JRST ILIPSI		;OTHER ERRORS TREATED IN GENERAL MANNER
;ECFORK

;CREATE FORK FOR PROGRAM. USED HERE AND FOR "\"

ECFORK:	MOVEI A,-1		;NO OPTIONS, REDICULOUS PC
	CFORK
	 ERROR < No forks available>
	MOVEM A,FORK		;HANDLE OF CURRENT INFERIOR
	FFORK			;LEAVE IT FROZEN
;TRANSMIT SPECIAL CAPABILITIES POSSIBLE TO NEW INFERIOR FORK,
; ENABLED IF ENABLED IN THIS EXEC.
;LATER SHOULD ONLY TRANSMIT RH, LH B0-B8 SHD COME FROM FILE ←←←←←←←←←←
	MOVE A,FORK
	MOVE B,[777000,,777777]	;XMIT WHEEL, ETC.  BITS 0-8
				;WILL COME FROM FILE EVENTUALLY
	SKIPE C,PRVENF		;IF USER HAS "ENABLE"D IN THIS EXEC,
	MOVE C,B		;ENABLE TRANSMITTED CAPABILITIES
	EPCAP
	MOVE A,[INPTTY,,PTTYMD]
	BLT A,PTTYMD+NTTYMD-1	;SETUP INITIAL TTY MODES
	RET
;SUBNAM SUBN4 SUBN4A SUBN5

;SUBNAM
;SUBR THAT CONVERTS JFN IN B TO APPROPRIATE SUBSYSTEM NAME WORD
;  FOR "SETNM" JSYS.
;STORES IN CELL "SUBSYS", DOESN'T "SETNM".
;TRANSPARENT, ONE USE IN "GET" CODE.

SUBNAM:	PUSH P,A
	PUSH P,B
	PUSH P,C
	PUSH P,D
;GET STRING FOR GIVEN JFN
	MOVE A,CSBUFP
		;JFN IS IN B
	MOVE C,[1B2+1B5+1B8+1B35]
	JFNS		;DEVICE:<DIRECTORY>NAME
	SETZ A,			;CONV DIR NAME TO SIXBIT IN A
	MOVEI B,6
	MOVE D,[POINT 6,A,-1]
	ILDB C,CSBUFP
	CAIE C,"<"		;LOOK FOR START OF DIR NAME
	JRST .-2
	ILDB C,CSBUFP
	CAIE C,">"		;END OF DIR NAME?
	JRST [	SUBI C,40	;NO, CONV TO SIXBIT
		JUMPLE B,.-2	;DON'T STORE IF ALREADY 6 CHARS
		IDPB C,D
		SOJA B,.-2]
	CAME A,['SUBSYS'] ;BELIEVE SUBSYS OR HACKS DIRECTORY
;	CAMN A,['HACKS ']
;	JRST SUBN4
	CAMN A,['SYSTEM']
	JRST SUBN4			;BELIEVE SYSTEM, TOO
	MOVE A,['(PRIV)']	;PRIVATE DIRECTORY, USE (PRIV)
	JRST SUBN5
;COMPARE SUCCEEDED, PACK SUBSYSTEM FILE NAME INTO SIXBIT AND USE IT.

SUBN4:	SETZ A,
	MOVE B,[POINT 6,A,-1]
	MOVEI D,6
SUBN4A:	ILDB C,CSBUFP
	JUMPE C,SUBN5		;END OF NAME, DONE
	TRC C,40		;CONVERT TO SIXBIT
	IDPB C,B
	SOJG D,SUBN4A		;ALSO STOP AT 6 CHARS
SUBN5:	MOVEM A,SUBSYS		;SUBSYS=PTTYMD+10
	JRST [	POP P,D
		POP P,C
		POP P,B
		POP P,A
		RET]
;.GOTO GOTO2

;GOTO <OCTAL #>

.GOTO:	CALL OCTAL
	 JRST CERR
	ALLOW TSPC+TALT+TEOL
	MOVE B,A		;ADDRESS INTO B FOR USE BELOW
	SKIPGE FORK		;CHECK HANDLE OF FORK KNOWN TO EXEC
	ERROR <No program>;		;NONE AT ALL
	CALL MAPPF		;MAP PAGE CONTAINING ADDRESS. GETS ACCESS.
	TLNN A,B5
	ERROR <No such page>
	TLNN A,B4
	ERROR <Can't execute that page>
	CONFIRM
	CALL CHKPAT		;SETUP STUFF FOR PA1050 IF LOADED

;START FORK AT ADDRESS IN B
;"DDT" JOINS HERE

GOTO2:	SETO A,
	CALL MAPPF		;UNSHARE MAPPED PAGE, IF ANY
	MOVEI E,PTTYMD		;SET UP PROGRAM'S TELETYPE MODES
	CALL LTTYMD		;..
	TLO Z,RUNF		;SAY PROGRAM'S TELETYPE MODES ARE IN EFFECT
	CALL IFORK		;PREPARE FORK(S) AND SETUP LRFORK
	TLNN B,1		;DON'T START IF LH NON-0
	SFORK		;START FORK (USES A AND B)
	JRST WAIT		;WAIT FOR IT TO TERMINATE
;.BDDT BDDT1 BDDT5 .NOBD

; "BDDT" COMMAND AND "NO BDDT" COMMANDS

;F1 IS CLEARED BY MAIN DISPATCH (TO .BDDT) AND SET BY "NO"

REPEAT 0,<

.BDDT:	TLNE Z,F1		;"NO BDDT" COMMAND?
	 JRST .NOBD
	SETOM A
	CALL MAPPF		;UNMAP ANY INFERIOR PAGE
	INTOFF			;WHILE THINGS ARE UP IN THE AIR
	MOVEI 1,BDFORK		;POINTER TO WHICH TO SETUP
	CALL CDBGFK		;CREATE DEBUGGER AND/OR USER FORKS
	 JRST BDDT5		;ALREADY EXISTS

BDDT1:	HRROI 2,[ASCIZ /<SUBSYS>BDDT.SAV/]
	MOVE 3,['BDDT  ']
	CALL LDRUND		;LOAD AND RUN IT
	INTON
	JRST WAIT

BDDT5:	CALL RSPLIC		;RESPLICE UFORK UNDER (DBFORK), REENTER
	INTON
	JRST WAIT




; "NO BDDT"   COMMAND
.NOBD:	INTOFF
	MOVEI 1,BDFORK		;OLD SUPERIOR
	MOVEI 2,IDFORK		;DESIRED NEW SUPERIOR
	CALL USPLIC		;DO THE UNSPLICE/RESPLICE
	INTON
	RET
>
;.IDDT IDDT1 IDDT5 .NOID

; "IDDT" COMMAND AND "NO IDDT" COMMANDS

;F1 IS CLEARED BY MAIN DISPATCH (TO .IDDT) AND SET BY "NO"

.IDDT:	TLNE Z,F1		;"NO IDDT" COMMAND?
	 JRST .NOID
	SETOM A
	CALL MAPPF		;UNMAP ANY INFERIOR PAGE
	INTOFF			;WHILE THINGS ARE UP IN THE AIR
	MOVEI 1,IDFORK		;POINTER TO WHICH TO SETUP
	CALL CDBGFK		;CREATE DEBUGGER AND/OR USER FORKS
	 JRST IDDT5		;ALREADY EXISTS

IDDT1:	HRROI 2,[ASCIZ /<SUBSYS>IDDT.SAV/]
	MOVE 3,['IDDT  ']
	CALL LDRUND		;LOAD AND RUN IT
	INTON
	JRST WAIT

IDDT5:	CALL RSPLIC		;RESPLICE UFORK UNDER (DBFORK)
	INTON
	JRST WAIT




; "NO IDDT"   COMMAND
.NOID:	INTOFF
	MOVEI 1,IDFORK		;OLD SUPERIOR
	SETO	2,
;;	MOVEI 2,BDFORK		;DESIRED NEW SUPERIOR
	CALL USPLIC		;DO THE UNSPLICE/RESPLICE
	INTON
	RET
;CDBGFK


;ROUTINES USED BY COMMANDS WHICH RUN PROGRAMS SUCH AS IDDT, BDDT,
; TENEX LOADERS, ETC.  THESE ALL OPERATE ON A "USER FORK".  WHEN
; THE COMMAND IS INVOKED, THE USER IS SPLICED UNDER THE FORK
; CONTAINING THE OPERATIONAL PROGRAM
;VARIABLES INVOLVED ARE:

;	UFORK:	CONTAINS -1 OR HANDLE OF USER FORK
;	IDFORK:	-1 OR HANDLE OF FORK CONTAINING IDDT
;	BDFORK:	-1 OR HANDLE OF FORK CONTAINING BDDT
;	DBFORK:	CONTAINS THE ADDRESS (IDFORK, BDFORK, ETC) OF THE
;		DEBUGGER (OR WHATEVER) CURRENTLY SPLICED ABOVE THE USER.
;	FORK:	(NO CHANGE) THE FORK THE EXEC IS CURRENTLY CONSIDERING
;		FOR THINGS LIKE ↑T, MEMSTAT, ETC.
;	LRFORK:	(NO CHANGE) FORK WHICH WILL BE RESUMED BY CONTINUE.





;CREATE THE DEBUGGER FORK AND/OR USER

;	1:	POINTER TO CELL TO REMEMBER THE HANDLE
;	SKIPS IF NEW FORK WAS CREATED FOR DEBUGGER

CDBGFK:	SKIPL 0(1)		;IS THERE A DEBUGGER ALREADY?
	 RET			;YES, NO-SKIP RETURN
	PUSH P,1
	SKIPGE FORK		;IS THERE AN INFERIOR?
	CALL ECFORK		;NO, MAKE ONE
	PUSH P,FORK		;SAVE INFERIOR
	CALL ECFORK		;GET A NEW FORK
	MOVE 1,FORK		;NEW FORK
	POP P,FORK		;USER FORK
	MOVEM 1,@0(P)		;SETUPT IDFORK OR BDFORK, ETC
	POP P,1
	MOVEM 1,DBFORK		;REMEMBER AS SUPERIOR OF UFORK
	AOS 0(P)		;SKIP RETURN
	RET
;LDRUND LDRUN2 LDRUN3 LDRUN4


;LOAD AND RUN THE DEBUGGER
;	1:	POINTER TO LOCATION CONTAINING THE HANDLE
;	2:	POINTER TO ASCIZ FILE NAME
;	3:	SETNM WORD


LDRUND:	PUSH P,1		;LOCATION CONTAINING HANDLE
	PUSH P,3		;SIXBIT OF 2
	MOVSI 1,(1B2!1B17)	;OLD, SHORT
	GTJFN
	 JRST [	SETOM 1
		EXCH 1,@-1(P)
		KFORK
		JRST CERR]
	HRL 1,@-1(P)		;FORM FORK.JFN
	GET
	MOVE 1,@-1(P)
	GEVEC
	HLRZS 2			;GET LENGTH
	CAIGE 2,3
	 JRST [	SETOM 1
		EXCH 1,@-1(P)
		KFORK
		UERR [ASCIZ /New program required/]]

LDRUN2:	MOVE 1,@-1(P)
	MOVE 2,FORK
	MOVEM 2,UFORK		;REMEMBER WHERE THE USER IS
	SPLFK			;MAKE B INFERIOR TO A
	 CALL [	PUSH P,1	;SAVE ERROR CODE
		SETO 1,
		EXCH 1,@-2(P)
		KFORK
		POP P,1
		JRST JERR]	;GO SAY ERROR FROM JSYS
LDRUN3:	MOVEM 1,PAGEN+1		;HANDLE BY WHICH DEBUGGER WILL KNOW INF.
	POP P,SUBSYS		;SIXBIT SUBSYSTEM NAME
	MOVEI 2,PAGEN
	MOVE 1,@0(P)
	SFACS
	MOVEI 2,2
LDRUN4:	SFRKV			;AT SPLICED ENTRY
	MOVEM 1,LRFORK		;FORK TO RUN IS DEBUGGER
	MOVEI E,PTTYMD		;RESTORE TTY MODES
	CALL LTTYMD
	TLO Z,RUNF		;TELL ↑C ROUTINE WHAT TO DO
	POP P,1
	RET
;USPLIC RSPLIC RSPLI5

;UNSPLICE

;	1:	POINTER TO CELL CONTAINING HANDLE OF OLD SUPERIOR
;	2:	POINTER TO CELL CONTAINING OF DESIRED NEW SUPERIOR

USPLIC:	SKIPG 0(1)		;ANY OLD SUPERIOR?
	 RET			;NO
	SKIPG UFORK
	 CALL SCREWUP		;DEBUGGER WITH NO INFERIOR?
	PUSH P,1
	SKIPG 1,0(2)		;NEW SUPERIOR SPECIFIED?
	 MOVEI 1,400000		;NO, USE THE EXEC ITSELF
	MOVE 2,UFORK		;GET HANDLE OF USER FORK
	MOVEM 2,FORK		;POINT THE EXEC AT HIM
	MOVEM 2,LRFORK		;THAT IS THE FORK TO RESUME WITH A CONT.
	SPLFK
	 CALL SCREWUP
	POP P,2
	SETO 1,
	EXCH 1,0(2)
	KFORK
	RET



;RESPLICE THE USER FORK UNDER THE DEBUGGER FORK IF NEEDED

;	1:	POINTER TO CELL CONTAINING DEBUGGER FORK HANDLE

RSPLIC:	PUSH P,1		;SAVE POINTER TO HANDLE
	PUSH P,0(1)		;SAVE ACTUAL HANDLE
	CAMN 1,DBFORK		;USER ALREADY UNDER DEBUGGER?
	 JRST RSPLI5		;YES
	MOVE 1,0(P)		;GET DEBUGGER HANDLE
	MOVE 2,UFORK		;FORK CONTAINING THE USER
	SPLFK
	 CALL SCREWUP
RSPLI5:	POP P,1
	MOVEI 2,1		;REENTER ADDRESS
	SFRKV
	MOVEM 1,LRFORK
	MOVEI E,PTTYMD
	CALL LTTYMD		;LOAD PROGRAM'S TTY MODES
	TLO Z,RUNF
	POP P,DBFORK		;POINT AT WHICH DEBUGGER IS IN USE
	RET
;.INTER .FINGE .SINK

;INTERROGATE (THE ARCHIVE)

REPEAT 0,<

;NOTE: THE INTERROGATE PROGRAM EATS THE REST OF THE COMMAND LINE.

.INTER:	ALLOW TSPC+TALT
	HRROI 2,[ASCIZ /<SYSTEM>ARCHIVE-LOOKUP.SAV/]
	CALL TRYGTJ
	 ERROR <No lookup program>
	TLO KWV1,PROGX		;SAY CONFIRMATION TO BE DONE BY LOOKUP
	JRST CIN4		;GO HANDLE AS AN EPHEMERON

>

;GIVE SOMEBODY THE FINGER

.FINGE:	ALLOW TSPC+TALT+TEOL
	HRROI 2,[ASCIZ /<SUBSYS>FINGER.SAV/]
	CALL TRYGTJ
	 ERROR <My FINGER is broken>
	TLO KWV1,PROGX		;SAY CONFIRMATION TO BE DONE BY LOOKUP
	JRST CIN4A		;GO HANDLE AS AN EPHEMERON

;SINK ALL OUTPUT (FOR LINKS)

.SINK:	ALLOW TSPC+TALT+TEOL
	HRROI 2,[ASCIZ /<MISC>SINK.SAV/]
	CALL TRYGTJ
	 ERROR <No SINK>
	TLO KWV1,PROGX		;SAY CONFIRMATION TO BE DONE BY LOOKUP
	JRST CIN4A		;GO HANDLE AS AN EPHEMERON
;.JFNCL

;JFNCLOSE <JFN>

.JFNCL:	CALL OCTAL
	 JRST CERR
	ALLOW TSPC+TALT+TEOL
	CAIG A,77
	CAIGE A,0
	 JRST CERR
	GTSTS
	TLNN B,B10
	 JRST CERR		;INVALID OR UNASSIGNED JFN
	CONFIRM
	MOVE B,JBUFP
	PUSH B,A		;PUT JFN IN STACK WHERE RLJFNS LOOKS
	MOVEM B,JBUFP
	JRST RLJFNS		;CLOSE IF OPEN, AND RELEASE JFN.
;.LIMIT $LIMIT .CORE .CPU .DISK .KILOC

;LIMIT (ADDITIONAL) CORE/CPU/DISK/KILOCORESECS (TO) N

REPEAT 0,<

.LIMIT:	NOISE <additional>
	KEYWD $LIMIT
	 T CPU,LPROK		;IS CPU THE RIGHT THING TO DEFAULT TO?
	 JRST CERR
	NOISE <to>
	CALL DECIN		;READ A NUMBER INTO A
	ALLOW TEOL+TALT+TSPC+TLPR
	JRST (KWV)		;DISPATCH

$LIMIT:	TABLE
	T CORE,LPROK
	T CPU,LPROK
	T DISK,LPROK
	T KILOCORESECS,LPROK
	TEND

.CORE:	NOISE <pages>
	CAILE A,1000
	ERROR <More than 512 pages !?>
	CONFIRM
		;NOW WHAT?
	JRST NIYE

.CPU:	NOISE <seconds>
	CAILE A,↑D720
	ERROR <More than 12 hours ???>
	CONFIRM
	JRST NIYE

.DISK:	NOISE <disk blocks>
	CAILE A,↑D2000		;?
	ERROR <Too much>;		;ETC
	CONFIRM
	JRST NIYE

.KILOC:	ALLOW TEOL+TALT+TSPC		;NO NOISE WORD
	CAILE A,↑D1000		;?
	ERROR <Too much>
	CONFIRM
	JRST NIM		;SAY "NOT IN MINISYSTEM"
>
;.LINK

;LINK (TERMINAL/USER)

.LINK:	NOISE (to)
	CALL TTYNUM		;GET LINE NUMBER, MAYBE FROM USER NAME
	MOVEI B,400000(A)	;FORM TTY DESIGNATOR
	HRLOI A,(1B2!1B3)	;TO AND FROM CONTROLLING TTY
	TLINK
	 ERROR <Refused>
	RET


;"LIST" IS WITH "TYPE" BELOW.
;.LOGIN LOGIN0 LOGIN1

;LOGIN COMMAND
;LOGIN (USER) <NAME> (PASSWORD) <NOT ECHOED> (ACCOUNT [#]) <#>

.LOGIN:	SKIPLE CUSRNO
	ERROR <You are already logged in>
	CALL LGNCHK		;TYPE MSG IF LOGINS ARE PROHIBITTED
	JUMPE A,LOGIN0		;NOTHING WAS TYPED, PROCEDE
	TYPE <
 You may attach to an existing job>	;PROVIDE ADDITIONAL INFO
	RET

;DECODE ARGUMENTS

;TWO GENERAL FORMS ACCEPTED: ARGS ON SAME LINE, TERMINATED WITH
;SPACE OR ALT MODE, AND ARGS ON SEPARATE LINES, TERMINATED WITH EOL.
;SECOND FORM IS INCONSISTENT WITH REST OF EXEC LANGUAGE BUT WAS ADDED
;BECAUSE IT MAKES HDX LOGIN CLEANER: ON HALF DUPLEX TTY, PASSWORD
;IS INPUT ON A SEPARATE LINE WHERE A MASK HAS BEEN TYPED.
;SPECIAL HANDLING OF EOL AS A TERMINATOR IS DONE BY THE "SPECEOL" SUBR
;WHICH IMMEDIATELY FOLLOWS "LOGIN" IN THIS LISTING.

LOGIN0:	JUMPE KWV,LOGIN1	;SKIP "USER" PROMPT IF IMPLICIT LOGIN
	CALL SPECEOL		;HANDLE TERMINATOR FOR THE WORD "LOGIN"
;FIRST ARGUMENT: USER NAME
	NOISE <user>;		;SEE COMMENTS ON "SPECEOL" ABOUT "NOISE"
LOGIN1:	CALL USERN		;INPUT USER NAME, XLATE TO USER # IN A
				;USE "DIRNAM" IF RECOGNITION DESIRED
	PUSH P,A		;SAVE INFO RETURNED BY "STDIR"
	TLNE A,B0
	ERROR <You cannot log in under that directory name>
	CALL SPECEOL		;HANDLE TERMINATOR OF "USER" FIELD
;2ND ARGUMENT: PASSWORD
	HRRZ A,(P)		;USER #
	CALL PASWD		;INPUT PASSWORD, RETURN POINTER IN A.
	PUSH P,A		;SAVE PTR FOR USE IN "LOGIN" JSYS CALL

;3RD ARGUMENT: ACCOUNT NUMBER
;	MOVE A,-1(P)		;WHAT STDIR RETURNED:B1 SAYS STRING ACCT
;	TLNN A,B1
;	NOISE <account #>;	IF USER REQUIRES NUMERIC ACCOUNT
;	TLNE A,B1
;	NOISE <account>;	IF USER REQUIRES STRING
;	CALL ACCT		;INPUT AND DECODE ACCT # (USES A)
;	PUSH P,A		;SAVE FOR LOGIN JSYS
	PUSH P,[500000,,↑D13]
	PUSH P,B		;SAVE PIE SLICE
	CONFIRM		;CONFIRM THE WHOLE COMMAND

;LOGIN...
;ALL ARGS DECODED, NOW LOG THE GUY IN

	SETOM MESMSF		;SAY TYPE "YOU HAVE A MESSAGE" IF
				;APPROPRIATE, EVEN AFTER ↑C'S
	POP P,D			;PIE SLICE
	POP P,C			;ACCT # OR PTR THERETO
	POP P,B			;PASSWORD PTR
	HRRZ A,(P)		;USER #
	LOGIN
	 CALL [	CAIN A,LGINX1	;CHECK FOR A FEW ERRORS NOT CHECKED B4.
		UERR [ASCIZ /Illegal account/]
		JRST JERR]	;GNRL JSYS ERR RET ROUTINE (XSUBRS.MAC).
	MOVE B,(P)		;WHAT "STDIR" RETURNED
	HRRZM B,CUSRNO		;STORE USER NUMBER
	PUSH P,A		;SAVE DATE & TIME OF LAST LOGIN
;UPDATE SPECIAL CAPABILITIES
	MOVEI A,B0
	RPCAP
	HLLZ C,B
	SKIPE PRVENF
	HRR C,B
	EPCAP
;LOGIN6 LOGI61 LOGIN7 LOGIN8

;LOGIN...
;KILL AUTOLOGOUT FORK WHICH WATCHES FOR ABANDONED JOB

	SKIPG ALOFH		;AUTOLOGOUT FORK HANDLE, OR 0 OR -1
	JRST LOGIN6		;NO AUTOLOGOUT FORK - EG STARTUP FAILED
	INTOFF
	MOVE A,ALOFH
	KFORK			;KILL THE FORK
	SETOM ALOFH		;SAY THE ALO FORK HAS BEEN KILLED
	INTON

;TYPE "JOB <N> ON LINE N <DATE> <TIME>"

LOGIN6:	ETYPE < Job %J on %L %D %E>
	PRINT EOL
IFN 1,<	;I LIKE THIS FEATURE, MAYBE REMOVE AGAIN THOUGH?
	SKIPN B,0(P)		;THE DATE
	 JRST LOGI61
	ETYPE < Previous login: %2D %E>
>
LOGI61:	CALL JOBCNT		;PRINT OTHER JOBS IF ANY FOR THIS USER

;TYPE SYSTEM LOGIN MESSAGE IF THERE IS ONE

LOGIN7:	PRINT EOL
	POP P,A			;DATE & TIME OF LAST LOGIN
	POP P,B			;WHAT STDIR RETURNED
	TLNE B,B2		;B2 SAYS ALWAYS PRINT LOGIN MESSAGE
	 JRST LOGIN8	;EXCEPT AT CCA B2=> NO LOGIN MESSAGES
;	SETZ A,			;SET DATE TO 0 TO FORCE PRINTING
	MOVE B,[POINT 7,[ASCIZ /<DOCUMENTATION>MESSAGE.TXT/]]
	CALL MESS
	MOVE B,[POINT 7,[ASCIZ /<DOCUMENTATION>LOGIN.MESSAGES/]]
	CALL MESS		;TYPE FILE IF IT IS NEW ENOUGH

;TYPE "YOU HAVE A MESSAGE" IF THE MESSAGE FILE IN THIS DIRECTORY
; HAS NOT BEEN READ SINCE THE LAST TIME IT WAS WRITTEN.  ALSO RUN
; USER'S INIT FILE.

LOGIN8:	CALL MESMES
	HRROI 2,[ASCIZ /[-LOGINIT-].SAV/]
	CALL TRYGTJ
	 JRST CMDIN4
	TLO KWV1,PROGX		;SAY CONFIRMATION TO BE DONE BY LOOKUP
	JRST CIN4A		;GO HANDLE AS AN EPHEMERON
;SPECEOL USERN USERN2 LGNCHK TYPE <

;SPECEOL
;SUBROUTINE TO HANDLE EOL AS FIELD TERMINATOR IN THE MIDDLE OF A COMMAND
; IN THE SPECIAL MANNER REQUIRED FOR "LOGIN".
;CR NORMALLY TERMINATES COMMAND, DEFAULTING ANY FOLLOWING FIELDS.
;BUT IF TRM=EOL AND THIS SUBROUTINE IS CALLED AND A "NOISE"
;  MACRO FOLLOWS THE CALL, THE FOLLOWING NOISE WORD IS TYPED
;  (AS AFTER ALT MODE), PARENTHESIZED TEXT IS IGNORED (AS AFTER SPACE),
;  AND FIELD IS INPUT NORMALLY, NOT DEFAULTED.

SPECEOL:ALLOW TSPC+TALT+TEOL+TLPR
	TRNN CBT,TEOL
	RET
	CALL PASCOM		;AFTER SEMICOLON PASS CHARACTERS TO EOL
;RETURN "!" IN AC "TRM". THIS CAUSES "NOISE" TO DO THE REQUIRED
;SPECIAL PROCESSING.
	MOVEI TRM,"!"
	RET

;USERN
;INPUT USER/DIRECTORY NAME SUBR
;USED BY "LOGIN" AND "ATTACH".
;RETURNS STDIR'S RETURNED INFO IN A.

USERN:	TLO Z,PUNCF		;ALLOW PUNCTUATION CHARS
	CALL CSTR		;INPUT A FIELD
	CALL BUFFF		;BUFFER IT RIGHT FOR JSYS, PUT PTR IN A
	MOVE B,A
	MOVE A,(B)		;GET FIRST PART OF DIR NAME
	CAME A,[ASCII /DC-20/]	;IS THIS THE DATACOMPUTER?
	 JRST USERN2		;NO
	PUSH P,B		;YES
	PUSH P,C
	MOVE A,COJFN
	GTTYP
	TRZ B,1			;SET TO CONTINUOUS-SCROLLING TERMINAL TYPE
	STTYP
	POP P,C
	POP P,B
USERN2:	SETZ A,			;NO RECOGNITION
	STDIR			;STRING TO DIRECTORY # TRANSLATION
	 JRST CERR
	 CALL SCREWUP
	ALTYPE ( )
	RET


;CHECK TO SEE IF NEW LOGINS ARE BEING ALLOWED. TYPES MSG IF NOT AND
; RETURNS A NON-0 IF THAT IS THE CASE.  IF LOGINS ARE OK, A RETURNED 0.

LGNCHK:	MOVE 1,['LGNPAR']
	CALL $SYSGT
	SKIPN 1,2		;SKIP IF IMPLEMENTED
	 RET			;0 SAYS "ALLOW LOGINS" TO CALLER
	HRRZS 1			;INDEX 0,,TABLE
	GETAB
	 CALL JERR		;LOT'S OF LUCK IF THIS HAPPENS
	SKIPN 2,1
	 RET			;0 SAYS OK
	CALL CRIF
	MOVEI 1,101
	SETZ 3,
	ERSTR
	 JFCL
	 JFCL
	TYPE <: New logins not permitted
>
	MOVE 1,2		;RETURN ERROR CODE (IE NON-0)
	RET
;ACCT ACCT0 ACCT1 ACCT2 ACCTX PIE.P PIEPX

REPEAT 0,<

;ACCT 
;SUBROUTINE TO INPUT ACCOUNT STRING, CONVERT TO NUMBER IF
; REQUIRED AND RETURN IN A A SUITABLE ARGUMENT FOR LOGIN OR CACCT JSYS
;TAKES IN A: B1 ON FOR STRING ACCT, OFF FOR # (AS RETURNED BY "STDIR")
;USED IN ACCOUNT, CHANGE, LOGIN COMMANDS.

ACCT:	PUSH P,B		;SAVE FOR CALLER
ACCT0:	CALL CSTR		;COLLECT A STRING
	ALLOW TSPC+TALT+TEOL
	TLO Z,NEOLF		;DON'T ECHO EOL'S
	PUSH P,A
	CAIN CNT,1		;JUST THE TERMINATOR INPUT?
	 JRST [	CALL DEFACT	;GET THE DEFAULT ACCOUNT FOR THIS USER
		CAMN 1,[-1]	;IS THERE A DEFAULT?
		 JRST [	CALL DING	;NO
			POP P,A		;GET BACK USER NUMBER
			JRST MORE]	;BACK INTO CSTR
		TRNE CBT,TALT	;ASKED FOR DEFAULT EXPLICTLY?
		ETYPE <%1M>	;YES, TYPE IT OUT
		ALTYPE ( )
		SUB P,[1,,1]
		JRST ACCTX]
	ALTYPE ( )
	TLNE A,B1
	JRST [	CALL BUFFF	;STRING CASE. SAVE IN BUFFER.
		JRST ACCT2]	;CHECK IT
ACCT1:	TLO Z,BAKFF		;NUMERIC CASE. USE FIELD ALREADY INPUT.
	CALL DECIN		;CONVERT
	 JRST CERR		;IT WAS NULL.
	JUMPLE A,.+2
	CAMLE A,[↑D999999]
	 JRST CERR		;OUT OF RANGE
	TLO A,500000		;SAY ITS NUMBER NOT STRING

ACCT2:	POP P,B
	CALL PIE.P		;SKIP IF PIE SLICE SYSTEM
	 SKIPN PRVENF		;SKIP IF ENABLED
	CAIA
	JRST ACCTX		;VERIFY IF NOT ENABLED ON PIE SLICE SYS.
	EXCH A,B
	VACCT
	 ERROR (Account invalid)
	EXCH A,B
ACCTX:	POP P,B
	RET



;SKIP IF PIE SLICE CODE ON SYSTEM

PIE.P:	PUSH P,1
	PUSH P,2
	MOVE 1,['GRPDES']
	CALL $SYSGT
	JUMPE 2,PIEPX
	AOS -2(P)
PIEPX:	POP P,2
	POP P,1
	RET
>
;DEFACT DEFA15 DEFAC2 DEFAC3

;ACCT ...

REPEAT 0,<

;GET DEFAULT ACCOUNT OF USER
;	1: USER DESIGNATOR

;RETURNS -1 OR ACCT DESIGNATOR IN AC1

DEFACT:	MOVE B,A		;SAVE FOR GDACC
	ADD P,[10,,10]		;ROOM FOR AN AC BLOCK
	JUMPGE P,[SUB P,[10,,10]	;UNDO PDL OVF
		PUSH P,[DEFACT+1]	;ERROR PC
		JRST SCREWUP]
	MOVSI A,-7+0(P)
	HRRI A,-7+1(P)
	SETZM -1(A)
	BLT A,0(P)		;CLEAR THE BLOCK

	MOVEI A,-7+0(P)		;WHERE TO STORE IT
	GDACC			;GET DEFAULT ACCOUNT DESIGATOR
DEFA15:	 JRST [	SUB P,[10,,10]
		SETOM A		;SAY DING NEEDED TO CALLER
		RET]

DEFAC2:	MOVE B,A		;FORM STRING PTR FOR BUFFS
	HRLI B,(POINT 7,)
	MOVEI CNT,↑D39		;FOR BUFFS
	LDB C,[POINT 3,A,2]
DEFAC3:	CAIE C,5		;NUMERIC MEANS DON'T BUFFER
	CALL BUFFS		;MOVE ASCIZIFIED STRING TO BUFFER
	SUB P,[10,,10]
	RET
>
;PASWD

;PASWD
;SUBROUTINE TO INPUT PASSWORD FOR "LOGIN", "ATTACH", AND "CONNECT".
;HANDLES HALF AND FULL DUPLEX CASES. 
;BUFFERS IT FOR USE AS A JSYS ARGUMENT AND RETURNS BYTE PTR IN A.
;CALLS "SPECEOL" AFTER IT.
;IF A=0, NO VALIDITY CHECK
;IF A<0, SPECIAL NOISE AND ALWAYS CHECK PASSWORD
;IF A>0, CHECKS VALIDITY FOR DIRECTORY # IN A IF NOT LOGGED IN.

PASWD:	PUSH P,B
	PUSH P,A
	MOVE A,CIJFN
	RFMOD			;READ TTY MODE
	TRNE B,1B32		;SKIP IF FULL DUPLEX
	JRST PASWD1


;FULL DUPLEX CASE
;DON'T ECHO PASSWORD FIELD, DO ECHO TERMINATOR
;PASSWORD IS ACTUALLY INPUT IN CALL TO "NOISE" IF THERE IS NO
;NOISE WORD, OTHERWISE IN "CSTR".
	CALL NOECHO		;TURN OFF ECHOING OF INPUT CHARACTERS
	SKIPL 0(P)
	NOISE <password>	;THIS CAN TURN ECHOING ON AGAIN
	SKIPGE 0(P)
	NOISE <from password>
	CALL NOECHO		;MAKE SURE ITS OFF
	TLO Z,PUNCF		;ALLOW "PUNCTUATION" CHARACTERS IN PASSWORD
	TLZ Z,EOLNEF		;TELL CSTR THAT NOISE DIDN'T ECHO EOL
	CALL CSTR		;(RE)READ PASSWORD STRING
	PRINT (TRM)		;ECHO TERMINATOR
	POP P,A			;0 OR GIVEN DIRECTORY #
	CALL PSWDCK		;BUFFER PASSWORD AND CHECK IT

;A MUST BE PRESERVED FROM HERE TO RETURN

	CALL DOECHO		;NOW WE WANT ECHOING ON
	CALL SPECEOL		;CHECK TERMINATOR, ETC
	ALTYPE ( )
	JRST PASWD3		;JOIN OTHER CASE
;PASWD1 PASWD3

;PASWD...
;HALF DUPLEX CASE
;USE SEPARATE LINE, TYPE MASK FIRST
;AS WITH FDX, PASSWORD IS READ BY "NOISE" IF NO (NOISE)

PASWD1:	TRNE CBT,TLPR
	JRST CERR		;DISALLOW ( AS USER NAME TERMINATOR
	TRNN CBT,TEOL		;TYPE EOL UNLESS USER ENDED USER NAME WITH EOL
	$TYPE <
>;
	MOVEI TRM,"!"		;MAKES "NOISE" TYPE " (PASSWORD) "
	SKIPL 0(P)
	U$TYPE [ASCII / (password) 
 /			;EXACTLY 3 WORDS (15 CHARS)
		BYTE (7)130,130,130,130,130,130,130,130,15,40
		BYTE (7)127,127,127,127,127,127,127,127,15,40
		BYTE (7)115,115,115,115,115,115,115,115,15,40
		BYTE (7)041,042,043,044,045,046,043,045,15,40,15,40,0]
		;PASWORD MASK, OVERLAYED X, W, M, AND GARBAGE
	SKIPGE 0(P)
	U$TYPE [ASCII / (from passowrd) 
 /			;EXACTLY 4 WORDS (20 CHARS)
		BYTE (7)130,130,130,130,130,130,130,130,15,40
		BYTE (7)127,127,127,127,127,127,127,127,15,40
		BYTE (7)115,115,115,115,115,115,115,115,15,40
		BYTE (7)041,042,043,044,045,046,043,045,15,40,15,40,0]
		;PASWORD MASK, OVERLAYED X, W, M, AND GARBAGE
	TLO Z,PUNCF
	CALL CSTR		;INPUT PASSWORD
	TRNE CBT,TLPR
	JRST CERR		;DISALLOW ( HERE
	PRINT CR		;SET TO OVERPRINT SAME LINE
	TYPE <Thank you ... >
	PRINT EOL
	PRINT EOL
	POP P,A
	CALL PSWDCK		;BUFFER AND MAYBE CHECK PASSWORD
	CALL SPECEOL
	MOVEI TRM,"!"		;FORCES "NOISE" TO TYPE NEXT NOISE WD
PASWD3:	POP P,B
	RET
;PSWDCK PSWDC4 PSWDCX

;PSWDCK
;PASSWORD BUFFERER AND CHECKER USED AT TWO PLACES IN "PASWD".
;TAKES: A: 0 OR DIRECTORY #.
;RETS:  B: BYTE PTR TO PASSWORD TEXT.
;PASSWORD MUST BE LAST FIELD CSTR'D.

PSWDCK:	PUSH P,A
	PUSH P,B
	CALL BUFFF
	MOVE BFP,.BFP		;FLUSH THE PASSWORD FIELD (↑R FIX)
	MOVEI CNT,0		;SAY CURRENT FIELD HAS NO CHR'S
	MOVE B,A
	EXCH A,-1(P)		;SAVE POINTER TO RETURN, GET DIRECTORY #
	JUMPL A,PSWDC4		;NEGATIVE, ALWAYS CHECK.
	JUMPE A,PSWDCX		;NO DIR # GIVEN, NO CHECK.
	SKIPLE CUSRNO		;IF LOGGED IN, NO CHECK.
	 JRST PSWDCX
PSWDC4:	MOVMS A
	TLO A,B0		;SAY PASSWORD CHECK ONLY, NOT CONNECT.
	CNDIR		;CHECK. ILLEGAL IF LOGGED IN.
	 JRST [	CAIN A,CNDIX1
		JRST CERR	;BAD PASSWORD. "?" AND ABORT COMMAND.
		CALL JERR]		;OTHER ERROR.
PSWDCX:	POP P,B			;AVOID PAGE FAULTS IN MULTI-LINE LITS
	POP P,A
	RET
;MESMES MESMS9

;MESMES
;SUBROUTINE TO TYPE "YOU HAVE A MESSAGE" IF FLAG "MESMSF" IS ON AND
;THERE IS A MESSAGE FILE IN CONNECTED DIRECTORY.
;ALSO PRINTS SCHEDULED SHUTDOWN TIME, AND RESTART TIME, IF ANY.
;AND DISC ALLOCATION EXCEEDED MESSAGE.
;USED IN LOGIN, MAIN LOOP. CLOBBERS A,B,C.

MESMES:	SKIPG CUSRNO
	JRST MESMS9		;IGNORE IF NOT LOGGED IN
	CALL DWNTIM		;PRINT SHUTDOWN/RESTART TIMES
	CALL CHKDAL		;NOTE OVER ALLOCATION IN PRESENT FIRST
	MOVE A,CUSRNO		;GET USER NUMBER
	CALL CHKMSG		;SKIP IF NEW MAIL EXISTS
	 JRST MESMS9
	CALL CRIF		;ADJUST CARRIAGE IF NEEDED
	TYPE <You have a message
>
	MOVE A,COJFN
	DOBE			;WAIT FOR IT TO REALLY PRINT
MESMS9:	SETOM MSGTIM		;DISABLE "MAIL WATCH"
	SETZM MESMSF		;CLEAR FLAG SO IT WONT BE REPEATED
	RET
;DWNTIM DWNTI5 DWNTI9

;PRINT THE SCHEDULED SHUTDOWN TIME
;AND EXPECTED RESTART TIME.
;FOR LOGIN AND SYSTAT

DWNTIM:	MOVE 1,['SYSTAT']
	CALL $SYSGT
	JUMPE 2,[RET]	;TABLE DOES NOT EXIST?
	PUSH P,2		;TABLE NUMBER
	MOVSI 1,27		;SHUTDOWN TIME CELL
	HRR 1,2			;TABLE NUMBER
	GETAB
	 CALL JERR
	JUMPE 1,[SUB P,[1,,1]
		RET]
	PUSH P,1
	CALL CRIF
	GTAD
	ADD A,[2,,0]
	CAMG A,(P)
	 JRST [SUB P,[2,,2]
		RET]
	TYPE <Tenex will go down >
	MOVE 1,COJFN
	POP P,2
	MOVSI 3,(1B1+1B3+1B6+1B10+1B12+1B17)
	ODTIM
	MOVE 1,0(P)		;SYSTAT TABLE NUMBER
	HRLI 1,30		;RESTART TIME
	GETAB
	 CALL JERR
	JUMPE 1,DWNTI5		;NO UPTIME DECLARED
	PUSH P,1
	TYPE < until >
	MOVE 1,COJFN
	POP P,2
	MOVSI 3,(1B1+1B3+1B6+1B10+1B12+1B17)
	ODTIM
DWNTI5:	MOVE 1,0(P)	;SYSTAT TABLE #
	HRLI 1,31		;REASON FOR SHUTDOWN
	GETAB
	 JRST DWNTI9		;MAY HAPPEN ON OLD SYSTEMS
	CAIN 1,5
	 TYPE <
 due to preventive maintenance>
	CAIN 1,6
	 TYPE <
 due to scheduled hardware work>
	CAIN 1,7
	 TYPE <
 due to scheduled software work>
	CAIN 1,8
	 TYPE <
 due to emergency restart>
DWNTI9:	SUB P,[1,,1]
	SETOM DWNMSF		;SIGNAL DOWNTIME PRINTED SO DONT RECHECK
	RET
;TRYGTJ TRYG9


;TRYGTJ
;TAKES: B: POINTER TO STRING FOR GTJFN
;RETS:	+1: NO SUCH FILE
;	+2: JFN IN A
;USED IN "MESS", AND IN "LOGIN" WITH REGARD TO PRIVATE MESSAGES.

TRYGTJ:	PUSH P,B
	PUSH P,A
	MOVSI 1,(1B2!1B17)	;SAY OLD FILE ONLY, SHORT GTJFN CALL
	GTJFN			;ASSIGN JFN USING STRING POINTER IN B
	 CALL [	CAIE A,GJFX24	;FAILURE. LOOK AT CODE. "NO NEW FILES"
		CAIN A,GJFX18		;"NO SUCH NAME"
		JRST [	SUB P,[1,,1]
			POP P,A
			JRST TRYG9]
		CAIE A,GJFX19		;"NO SUCH EXTENSION"
		CAIN A,GJFX20		;"NO SUCH VERSION"
		JRST [	SUB P,[1,,1]
			POP P,A
			JRST TRYG9]
		CAIN A,GJFX35
		 ERROR <Directory protected>
		JRST JERR]
	MOVE B,JBUFP		;SAVE JFN IN JFN STACK, SO IT WILL BE
	PUSH B,A		;RELEASED ON ↑C OR ERROR
	MOVEM B,JBUFP		;..
	SUB P,[1,,1]		;FORGET SAVED A
	AOS -1(P)		;SKIP
TRYG9:	POP P,B
	RET
;MESS MESS2 MESS3 MESS4 MESS7 MESS8 MESS9

;MESS
;SUBROUTINE TO PRINT MESSAGE FROM A GIVEN FILE, IF FILE EXISTS.
;SLOW NOP IF FILE DOES NOT EXIST.
;TAKES: A: A DATE & TIME. FILE PRINTED IF NEWER THAN THIS.
;		TYPICALLY, THIS IS THE LAST LOGIN TIME.
;	B: STRING POINTER TO FILE NAME. CLOBBERS B.
;7/3/70: ONLY ONE CALL, IN "LOGIN"

MESS:	PUSH P,C
	PUSH P,A		;SAVE CONVERTED GIVEN DATE & TIME
	CALL TRYGTJ		;ASSIGN A JFN TO FILE NAMED BY STRING
	JRST MESS9		;NO SUCH FILE
	PUSH P,A		;MESSAGE FILE JFN
	MOVE B,[1,,FDBWRT]
	MOVEI C,C
	GTFDB			;GET WRITE DATE & TIME FROM FILE
	CAMGE C,-1(P)		;COMPARE TO GIVEN
	 JRST MESS8		;NO NEED TO PRINT IT

MESS2:	MOVE A,-1(P)
	PUSH P,A		;A COPY OF DATE
	MOVE A,COJFN		;JFN FOR OUTPUT
	TLO A,(1B1)		;NO STATIC IF NO SYSTEM MSG
	PUSH P,A
	MOVEI 1,400000		;THIS FORK
	RPCAP
	MOVEI 1,CTRLC		;↑C TERMINAL CODE
	TLNE 3,(1B0)		;IF ↑C CAP ENABLED
	DTI			;TURN OFF ↑C
	MOVEI A,0		;NO SPECIAL CAPS.
	CFORK
	 CALL [	INTON
		JRST JERR]
	PUSH P,1		;FORK HANDLE
	MOVSI 1,(1B2+1B17)	;OLD, SHORT
	HRROI 2,[ASCIZ /<SUBSYS>READMAIL.SAV/]
	GTJFN
	 JRST MESS4		;READMAIL NOT AVAILABLE
MESS3:	HRL 1,0(P)		;MAKE FORK.JFN
	GET			;AND RELEASE READMAIL JFN
	MOVE 1,0(P)		;FORK HANDLE
	MOVEI 2,-4(P)		;WHERE GOODIES ARE
	SFACS			;FROM ON THE STACK
	GEVEC
	MOVEI 2,1(2)		;REENTER ADDR, EVEN IF OLD EV
	SFORK
	WFORK

MESS4:	POP P,1			;FORK HANDLE
	KFORK
MESS7:	MOVEI 1,400000
	RPCAP
	MOVE 1,[CTRLC,,1]	;↑C ON CHANNEL 1
	TLNE 3,(1B0)		;IF THIS FORK HAS ↑C CAP ENABLED
	ATI			;ALLOW ↑C AGAIN
	POP P,1			;JUNK (COJFN)
	POP P,1			;JUNK (COPY OF DATE)
MESS8:	POP P,1			;MESSAGE FILE JFN
	RLJFN
	 CALL JERR
MESS9:	POP P,A			;FROM CALLER
	POP P,C			; "
	RET
;.KKJOB .LOGOU LOGOU1 LOGO14 LOGOU2 LOGOU3

;KKJOB

.KKJOB:	HRROI A,[ASCIZ/Bye
/]
	PSOUT
	DTACH
	SETO A,
	LGOUT
	 CALL JERR

;LOGOUT

.LOGOU:	TRNN CBT,TEOL		;STANDARD CASE IF EOL TERMINATED
	SKIPG CUSRNO		;LOGGED IN?
	JRST LOGOU1		;NO, ONLY ONE CASE
	INHELP <
EOL or job number>
	ALLOW TEOL+TSPC+TALT
	TLO Z,BAKFF
	CALL DECIN		;TRY TO READ JOB NUMBER
	 JRST LOGOU1		;NO NUMBER, LOGOUT THIS JOB
	JRST ..LOGO		;LOGOUT ANOTHER JOB

LOGOU1:	CALL INFER		;SKIP IF INFERIOR
	 JRST LOGO14
;	MOVEI 1,400000		;INFERIOR, GET CAPABILITIES
;	RPCAP
;	TLNN 2,(1B3)		;"LOG" CAPABILITY? (CHECK THIS←←←)
;	 ERROR <Not legal in inferior EXEC>
	TYPE < [Inferior EXEC]>
	TLO KWV1,CONMAN		;REQUIRE CONFIRMATION
LOGO14:	CONFIRM
	MOVEI 1,HUCODE		;"HANG UP" INTERRUPT CODE
	DTI			;↑C AND ERRORS ATI AT CMDN2D
	SKIPG CUSRNO		;NOW LOGGED IN?
	JRST LOGOU3		;NO, NO EXPUNGE OR CHKDAL
LOGOU2:	GJINF
	MOVE 1,2		;CONNECTED DIRECTORY
;	DELDF			;"EXPUNGE"
	CALL CHKDAL		;YES, NOTE OVER ALLOC IF PRESENT
	CALL JOBCNT		;PRINT OTHER JOBS OF THIS USER
	GJINF
	PUSH P,A
	CNDIR	;CONNECT TO LOGIN DIRECTORY
	 JFCL
	POP P,A
	CALL CHKMSG
	 JRST LOGOU3	;NO NEW MSGS
	TYPE < You have unread messages, please reconfirm logout.>
	TRZ CBT,TEOL	;MAKE CONFIRM TYPE <CR>
	TLZ KWV1,NOCONF+ALTCON
	TLO KWV1,CONMAN
	CONFIRM
LOGOU3:	TLO Z,LOGOFF		;SAY LOGGING OUT (TELLS ERROR AND ↑C
				;ROUTINES TO SAY "NOT LOGGED OUT").
	MOVE A,COJFN
	DOBE			;WAIT TO GIVE HIM MAXIMUM CHANCE TO ↑C.

	CALL RESET
;	CALL BREAK2		;DO "BREAK" AND "REFUSE"
	HRLOI A,(1B0+1B1)
	MOVEI 2,-1
	TLINK		;BREAK ALL TTY LINKS
	 JFCL

	SETO A,			;SAY ITS SUICIDE
	LGOUT
	 CALL JERR
	;BETTER NOT RETURN IF SUCCESSFUL
;JOBCNT JOBCN1 JOBCN2 JOBCN8 JOBC84 JOBCN9 JOBCNX

;COUNT JOBS LOGGED IN UNDER THIS USER'S DIRECTORY

;IF MORE THAN ONE, PRINT INFORMATIVE MESSAGE

JOBCNT:	GJINF
	MOVE E,A		;LOGIN DIRECTORY #
	SETO D,			;GET LENGTH OF 'JOBDIR' GETAB
	GTB 3			;WHICH IS CONN#,,LOGIN# [JOB#]
	HRLZ D,A		;SET UP LENTH,,INDEX FOR AOBJN & GTB.
	SETZB F,G		;INIT TOTAL AND DET COUNTS

JOBCN1:	GTB 3			;JOBDIR(D) TO A
	CAIE E,0(A)		;ONE OF THIS USER'S JOBS?
	 JRST JOBCN8		;NO, TRY NEXT

JOBCN2:	GTB 0			;JOBPT(D) TO A
	SKIPGE A		;SKIP IF NOT DETACHED
	ADDI G,1		;INCREMENT DET COUNT
	ADDI F,1		;INCREMENT TOTAL COUNT

JOBCN8:	AOBJN D,JOBCN1		;CHECK ALL JOBS
	CAIG F,1		;MORE THAN JUST THIS JOB?
	 JRST JOBCNX		;NO. DONE
	SUBI F,1		;REDUCE TO NUMBER OF OTHER JOBS
	CALL CRIF		;TYPE CARRIAGE RETURN IF NEEDED
	CAIN F,1
	 JRST JOBC84
	ETYPE <[%5R has %6Q other jobs>
	SKIPE G			;CHECK DET COUNT
	ETYPE <, %7Q detached>
	PRINT "]"
	JRST JOBCN9

JOBC84:	SKIPN G			;ONE OTHER JOB, HOW MANY DETACHED?
	ETYPE <[%5R has one other job]>
	SKIPE G
	ETYPE <[%5R has a detached job]>
JOBCN9:	PRINT EOL
JOBCNX:	RET
;.MAIL $MAIL M..CHK M..WAT $M.WAT M.WA.F M.WA.N

;"MAIL"

.MAIL:	KEYWD $MAIL
	 0
	 JRST CERR
	JRST 0(KWV)

$MAIL:	TABLE
	T CHECK,EOLOK,M..CHK
	T WATCH,,M..WAT
	TEND

M..CHK:	NOISE <for user>
	TLO Z,NEOLF		;SUPPRESS ECHO OF EOL
	CALL DEFDIR		;INPUT A USER NAME TO A
				;(NEAR PRINTER CHECK)
	PUSH P,A
	ALLOW TSPC+TALT+TEOL
	CONFIRM
	CALL CRIF
	POP P,A
	CALL CHKMSG		;FOR USER # IN A
	 TYPE <No >
	TYPE <New mail exists>
	RET


;"MAIL WATCH ON/OFF"

M..WAT:	KEYWD $M.WAT
	 TE ON,,M.WA.N
	 JRST CERR
	JRST 0(KWV)

$M.WAT:	TABLE
	TE OFF,,M.WA.F
	TE ON,,M.WA.N
	TEND

M.WA.F:	ALLOW TSPC!TALT!TEOL
	ALTYPE ( )
	CONFIRM
	SETOM MSGTIM
	RET

M.WA.N:	ALLOW TSPC+TALT+TEOL
	ALTYPE ( )
	CONFIRM
	SETZM MSGTIM
	RET
;CHKMSG CHKMS4 CHKMS9

;CHKMSG

;SKIPS IF NEW MAIL EXISTS FOR USER # SUPPLIED IN A
;USED IN MAIN LOOP, LOGIN, AND MAIL COMMANDS

CHKMSG:	PUSH P,A
	PUSH P,B
	PUSH P,C
	HRROI A,CSBUF		;POINTER TO STRING AREA BEGINNING
	MOVEI B,"<"		;FORM <USER>MESSAGE.TXT
	BOUT
	MOVE B,-2(P)		;USER #
	DIRST
	 CALL JERR
	HRROI B,[ASCIZ />MESSAGE.TXT;1/]
	SETZ C,
	SOUT
	HRROI B,CSBUF
	CALL TRYGTJ		;GET JFN AND STACK IT FOR RELEASE
	 JRST CHKMS9		;GIVE NO SKIP RETURN
	MOVE B,[2,,FDBWRT]	;WRITE AND READ DATES
	MOVEI C,B		;TO B AND C
	GTFDB
	CAMG B,C		;WRITTEN MORE RECENTLY THAN READ?
	 JRST [	MOVEI C,0	;NO, FORCE NO TYPEOUT
		JRST CHKMS4]
	MOVE B,[1,,FDBSIZ]
	MOVEI C,C
	GTFDB			;GET # BYTES IN FILE
CHKMS4:	RLJFN			;GET RID OF JFN
	 CALL JERR
	MOVN A,[1,,1]		;REMOVE FROM STACK TOO
	ADDB A,JBUFP
	SETOM 1(A)
	JUMPLE C,CHKMS9		;NO MSG IF FILE IS NULL
	AOS -3(P)		;ARRANGE FOR SKIP RET
CHKMS9:	POP P,C
	POP P,B
	POP P,A
	RET
;.MOUNT

;"MERGE" IS WITH "GET" ABOVE.

;MOUNT <DEVICE>

.MOUNT:	CALL DEVN
	TLNN B,B7
	ERROR <%1H: not a mountable device>
	TLNN B,B5
	JRST [	TLNN B,B6
		UERR [ASCIZ /%1H: not available/]
		UERR [ASCIZ /%1H: assigned to job %3Q/]]
	CONFIRM
	MOUNT		;NO ERROR IF ALREADY MOUNTED.
	 CALL JERR
	RET
;.NO $NO

;"NO" PREFIX

;THE "NO" PREFIXED VERSIONS GO THRU THE SAME ROUTINES AS THE UNPREFIXED
;VERSIONS, BUT WITH F1 SET WHICH REVERSES THE EFFECT OF THE SUBROUTINES
;THEY CALL.  F1 IS CLEAR ON DISPATCH FROM THE MAIN LOOP.

.NO:	KEYWD $NO		;"NO". LOOK UP NEXT WORD.
	 TE EXEC
	JRST CERR		;NULL ILLEGAL
	CONFIRM
	TLO Z,F1		;SAY NO
	JRST (KWV)		;GO TO .FORMF, .TABS, OR .LOWER.

$NO:	TABLE
;	TE BDDT
	TE EXEC
	TE FORMFEED
	TE IDDT
	TE INDICATE
	TE LOWERCASE
	TE RAISE
	TE SHOW
	TE TABS
	TEND
;.NOT $NOT

;"NOT" COMMAND PREFIX

.NOT:	KEYWD $NOT
	 T EPHEMERAL,LANOK+LPROK,.NOTEP
	 JRST CERR		;NULL NOT ACCEPTABLE
	 JRST (KWV)		;OFF TO ROUTINE

$NOT:	TABLE
	T EPHEMERAL,LANOK+LPROK,.NOTEP
;	T PERPETUAL,LANOK+LPROK,.NOTPE
	TEND
;.NUMBE

;"NUMBER (OF DIRECTORY) <NAME>"

;RETURNS DIRECTORY NUMBER (FOR 10/50 PPN'S AND KNOWING WHICH DIR TO MAP)

.NUMBE:	NOISE <of directory>
	CALL DIRNAM		;INPUT DIRECTORY NAME WITH RECOGNITION
	ALTYPE ( )
	ALLOW TEOL+TSPC+TALT	;CHECK TERMINATOR
	CONFIRM			;MUST ALWAYS DO THIS
	ETYPE ( Directory number %1P)
	RET
;.NOTPE .PERPE PERPE0

;"PERPETUAL <FILE LIST>"     AND  "NOT PERPETUAL <FILE LIST>"

REPEAT 0,<

;SETS OR CLEARS FDBUND BIT IN FDBCTL

.NOTPE:	HRLI B,-2		;DEFAULT VERSION TO LOWEST
	TLOA Z,F1		;REMEMBER "NOT"
.PERPE:	HRLI B,0		;DEFAULT VERSION IS HIGHEST
	NOISE <files>
	MOVE A,[2,,2]		;SAY DEFAULT NAME AND EXT TO PREVIOUS
	HRRI B,B2+B11+B15+B16	;OLD FILE, *'S, COMMA OK
	CALL SPECFN		;INPUT FILE NAME DESCRIPTOR
	 JRST CERR
	ALLOW TSPC+TALT+TEOL
	CONFIRM
	CALL FRSTF		;TYPE NAME IF A GROUP
PERPE0:	HRRZ A,@INIFH1		;JFN
	DVCHR
	TLNN B,(1B4)		;DISK?
	 JRST [	UTYPE [ASCIZ / not a disk file/]
		JRST NEXTF]
	HRRZ A,@INIFH1		;JFN
	HRLI A,FDBCTL
	MOVSI B,(FDBUND)	;CHANGE "UNDELETABLE" BIT
	TLNE Z,F1		;"NOT PERP" ?
	TDZA C,C		;YES, CLEAR THE BIT
	MOVSI C,(FDBUND)
	CHFDB
	JRST NEXTF		;GET NEXT FILE, RET TO PERPE0
>
;.PRNTR $PRNTR P..CHK P..WAT $P.WAT P.WA.F P.WA.N DEFDIR DEFDI1

;"PRINTER"

REPEAT 0,<

.PRNTR:	KEYWD $PRNTR
	 0
	 JRST CERR
	JRST 0(KWV)

$PRNTR:	TABLE
	T CHECK,EOLOK,P..CHK
	T WATCH,,P..WAT
	TEND

P..CHK:	NOISE <for user>
	TLO Z,NEOLF		;SUPPRESS ECHO OF EOL
	CALL DEFDIR		;INPUT DIRECTORY NAME WITH RECOG
	PUSH P,A		;SAVE IT
	ALLOW TSPC!TALT!TEOL
	CONFIRM
	CALL CRIF
	TYPE <Printing>
	POP P,A
	CALL CHKPRN		;CHECK PRINTER FOR USER IN A
	 TYPE < not>
	TYPE < in progress>
	RET

;"PRINTER WATCH ON/OFF"

P..WAT:	KEYWD $P.WAT
	 TE ON,,P.WA.N
	 JRST CERR
	JRST 0(KWV)

$P.WAT:	TABLE
	TE OFF,,P.WA.F
	TE ON,,P.WA.N
	TEND

P.WA.F:	ALLOW TSPC!TALT!TEOL
	ALTYPE ( )
	CONFIRM
	SETOM PRNTIM
	RET

P.WA.N:	ALLOW TSPC!TALT!TEOL
	ALTYPE ( )
	CONFIRM
	SETZM PRNTIM
	RET
>;REPEAT 0

;INPUT OR DEFAULT DIRECTORY NAME
;	USED BY "MAIL CHECK" AND "PRINTER CHECK"

DEFDIR:	TLNE Z,BAKFF		;IS THERE AN UN-INPUT FIELD?
	 JRST DEFDI1		;YES. USE DIRNAM TO READ IT
	TRNE CBT,TEOL		;NO. EOL TERMINATED PREVIOUS FIELD?
	SKIPA A,CUSRNO		;YES. USE LOGIN DIRECTORY (IF ANY)
DEFDI1:	CALL DIRNAM		;INPUT A DIRECTORY NUMBER TO A
	ALTYPE ( )
	SKIPG A			;IS HE LOGGED IN?
	 ERROR <You are not logged in>
	RET
;CHKPRN CHKPR1 CHKPRX

;CHECK PRINTER ROUTINE

REPEAT 0,<

;CALLED FROM MAIN LOOP WITH USER NUMBER IN 1
;SKIPS IF A FILE(S) <PRINTER>LPT.USER;* EXISTS

CHKPRN:	PUSH P,1
	PUSH P,2
	PUSH P,3
	HRROI 1,CSBUF		;STRING BUFFER AREA
	HRROI 2,[ASCIZ /<PRINTER>LPT./]
	SETZ 3,
	SOUT
	HRRZ 2,-2(P)		;USER #
	DIRST
	 CALL [	SETOM PRNTIM	;CANCEL THE WATCH
		JRST JERR]
CHKPR1:	MOVSI 1,(1B2!1B17)	;OLD, SHORT
	HRROI 2,CSBUF
	GTJFN
	 JRST CHKPRX		;NONE THERE. NO SKIP.
	RLJFN
	 CALL JERR
	AOS -3(P)		;ARRANGE FOR SKIP RETURN

CHKPRX:	POP P,3
	POP P,2
	POP P,1
	RET

>;REPEAT 0
;.QUIT QUIT1 QUIT2

;QUIT: EXIT TO SUPERIOR EXEC OR OTHER PROGRAM.
;IF TOP-LEVEL FORK, LEGAL ONLY FOR ENABLED WHEELS OR OPERS.

.QUIT:	CALL INFER		;SKIP IF INFERIOR
	 JRST [	HRLZI B,WHLUO+OPRUO
		SKIPE PRVENF
		CALL PRVCK
		UERR [ASCIZ /Not legal in top-level EXEC/]
		JRST QUIT1]		;DON'T DISABLE ↑C AT TOP LEVEL
;DEASSIGN SUPER-PANIC PSI CHARACTER ↑C
		;IF POSSIBLE, TEST WHETHER ASSIGNED TO THIS FORK ←←←←←←←
		;MEANWHILE, JUST TEST SPEC CAP
	MOVEI A,B0
	RPCAP			;GETS ENABLED CAPS IN C
	MOVEI A,CTRLC
	TLNE C,B0
	DTI			;DEASSIGN TERMINAL INTERRUPT
QUIT1:	MOVEI A,CTCODE		;CHAR THAT PRINTS RUNTIME (↑T)
	DTI
	MOVEI A,HUCODE		;DATAPHONE HANGUP CODE
	DTI
	MOVEI E,PTTYMD		;PASS BACK TTY LEFT BY PROGRAM
	CALL LTTYMD

QUIT2:	CALL INFER		;SKIP IF INFERIOR EXEC
	 JRST [	JSYS 777	;CALL MINI-EXEC
		JRST REE]	;AFTER  ↑  TO MINI-EXEC
	MOVE 1,SUPSUB
	SETNM			;BUT RESTORE SUPERIOR'S SUBSYS
	HALTF
	JRST REE		;AFTER CONTINUE FROM SUPERIOR EXEC
;INFER INFER0 INFER1 INFER3 INFRS INFER6 INFER9

;INFERIORNESS TEST SUBROUTINE: SKIP IF THIS FORK HAS A SUPERIOR
;USED IN LOGOUT, QUIT, ↑E EDDT.

INFER:	PUSH P,A
	PUSH P,B
INFER0:	MOVEI A,INFER3		;SET TO CATCH TRAPS FROM GFRKH
	MOVEM A,ILIDSP		;ON MONITORS WITHOUT IT (BEFORE 1.31)
INFER1:	MOVEI 2,400000		;SELF
	MOVNI 1,1		;RELATIVE TO SUPERIOR
	GFRKH			;GET FORK HANDLE
	 JRST INFER3		;NO MORE HANDLES, OLD MONITOR, ETC
	SETZM ILIDSP		;NOT INTERESTED IN ILLEGAL INSTRS NOW
	CAIN 1,400000		;SELF MEANS WE ARE TOP FORK
	 JRST INFER6		;SO GIVE SKIP RETURN
	RFRKH
	JRST INFER9		;GIVE SKIP

INFER3:	SETZM ILIDSP		;NO LONGER INTERESTED IN ILLEGAL INSTRS.
	MOVEI A,-1		;SUPERIOR FORK HANDLE
INFRS:	RFSTS
	CAMN A,[-1]
INFER6:	 JRST [	POP P,B		;SUPERIOR HANDLE INVALID
		POP P,A		;MEANS NO SUPERIOR.
		RET]
;BUT RFSTS MAY RETURN THIS FORK'S STATUS IF NO SUPERIOR.
;ASSUME IT IS SELF (AND NO SUPERIOR) IF PC RETURNED
; IS THAT WHERE RFSTS IS.
	MOVEI B,(B)		;MASK PC
	CAIE B,INFRS+1
INFER9:	AOS -2(P)		;DIFFERENT, WE HAVE A SUPERIOR
	 JRST [	POP P,B
		POP P,A
		RET]
;.PROTE

;PROTECTION (OF FILE) <EXISTING NAME> (IS) <18 BIT OCTAL>

.PROTE:	NOISE <of file>
	HRROI A,
	CALL CINFN
	 JRST CERR
	ALLOW TSPC+TALT+TLPR
	NOISE <is>
	CALL OCTCOM		;OCTAL INPUT TO A. ALLOWS LH,,RH ETC.
	 JRST CERR		;NULL - NO DEFAULT.
	TLNE A,-1
	ERROR <Left half must be 0>	;ONLY NUMERIC PROTECTIONS NOW
					;OCTCOM CHECKS TERMINATOR.
	TRNN A,1B22
	ERROR < You can't make protection invisible (20000-BIT)>
	CONFIRM
	TLO A,500000		;SAY THERE'S 18-BIT PROTECTION IN RH
	PUSH P,A
	MOVE A,CJFN1
	DVCHR
	TLNN B,B4		;MULTIPLE DIRECTORY DEVICE?
	ERROR <%1H: doesn't have protected files>
	MOVE A,CJFN1
	POP P,C
	HRLI A,FDBPRT		;PROTECTION WORD IN FDB
	MOVEI B,-1		;CHANGE RH
	CHFDB			;THIS COULD ITRAP, SHOULD BE PROTECTED
	JRST RLJFNS

;THE FOLLOWING SHOULD REPLACE THE ABOVE IF CPRTF IS EVER IMPLEMENTED

REPEAT 0,<
	CPRTF		;CHANGE PROTECTION OF FILE
	 CALL [	CAIN A,CPRTX1
		ERROR <Protection of %1S is protected from you>
		JRST JERR]
	JRST RLJFNS		;RELEASE JFNS AND POPJ TO CMDIN4.
>
;.RECEI $RECTB ..ADVZ ..LINK

;RECEIVE

.RECEI:	KEYWD $RECTB
	 T LINKS,EOLOK,..LINK
	 JRST CERR
	 JRST (KWV)

$RECTB:	TABLE
;	T ADVICE,EOLOK+LPROK,..ADVZ
	T LINKS,EOLOK,..LINK
	TEND

REPEAT 0,<
..ADVZ:	NOISE <from>
	CALL TTYNUM
	MOVEI 1,400000(1)	;FORM TTY DESIGNATOR
	TLO 1,(1B2)		;SET "ACCEPT" ADVICE FLAG
	ADVIZ
	 CALL [	CAIN 1,ADVX2
		 ERROR <Ignored>
		CAIN 1,ADVX4
		 ERROR <Advice already in progress>
		JRST JERR]
	RET
>

..LINK:	CONFIRM
	INTOFF			;BE SURE BOTH ADVISE AND TLINK HAPPEN
	HRLOI 1,(1B4+1B5)
	TLINK
	 CALL [	INTON
		JRST JERR]
REPEAT 0,<
	MOVSI 1,(1B0)		;BREAK "ADVISE" LINK
	ADVIZ
	 CALL [	INTON
		JRST JERR]
>
	INTON
	RET
;$REENT .REENT ..REEN

;REENTER
;DECODE AND CHECK SUBROUTINE ALSO USED BY REDIRECT/DETACH

$REENT:	SKIPGE A,FORK
	ERROR <No program>
	GEVEC
	HLRZ B,B
	CAIE B,<JRST>B53
	 JRST [	CAIGE B,2		;LONG ENOUGH TO HAVE REENTER?
		UERR [ASCIZ /No reenter address/]
		RET]
	MOVEI A,.JBREN		;COMPATIBLE CASE CHECK
	CALL MAPPF
	TLNN A,B5
	ERROR <No page 0>
	TLNN A,B2
	ERROR <Page 0 read-protected>
	MOVEI A,.JBREN
	HRRZ A,PAGEN(A)
	JUMPE A,[UERR [ASCIZ /No reenter address/]]
	RET

;REENTER COMMAND DISPATCHES HERE

.REENT:	CALL $REENT
	CONFIRM
;REDIRET/DETACH...(AND) REENTER  JOINS HERE

..REEN:	MOVNI B,2		;REENTER CODE FOR PA1050
	CALL CHKPAT		;SETUP PA1050 IF THERE
	MOVEI E,PTTYMD		;SET TTY MODES TO PROGRAM'S
	CALL LTTYMD		;.. (EXEC'S MODES NEEDN'T BE STORED)
	JUMPG B,.+2		;PA1050 START IF POSITIVE
	MOVEI B,1		;ENTRY VECTOR INDEX 1 FOR REENTER
	JRST START2		;JOIN START COMMAND
;.REFUS

;REFUSE (LINKS)
; REFUSES BOTH ORDINARY LINKS AND ADVISE LINKS


.REFUS:	NOISE <links>
	CONFIRM
	INTOFF			;BE SURE BOTH HAPPEN
	HRLOI A,(1B4)		;CHANGE ACCEPT BIT TO 0
	TLINK
	 CALL JERR
REPEAT 0,<
	MOVSI 1,(1B0)		;"BREAK"
	ADVIZ
	 CALL JERR
>
	INTON
	RET
;.RENAM

;RENAME (EXISTING FILE) <NAME> (TO BE) <NAME>

.RENAM:	NOISE <existing file>
	HRROI A,		;SAY NO DEFAULT EXTENSION
	CALL CINFN		;GET INPUT FILE NAME
	 JRST CERR		;NO DEFAULT IF USER TYPES "-"
	ALLOW TSPC+TALT+TLPR
	NOISE <to be>
	MOVE A,[2,,2]	;SAY DEFAULT NAME AND EXT TO THOSE OF FIRST FILE
	CALL COUTFN		;OUTPUT FILE NAME, OLD OR NEW.
	 JRST CERR
	CONFIRM
	MOVE A,CJFN1		;EXISTING FILE JFN
	MOVE B,CJFN2		;NEW FILE JFN
	RNAMF		;RENAME FILE
	 CALL [	CAIN A,RNAMX1
		 ERROR <Files not on same device>
		CAIN A,RNAMX4
		 ERROR <No room>
		CAIN A,RNAMX5
		 ERROR <Destination busy>
		CAIN A,RNAMX8
		 ERROR <No access to source>
		CAIN A,RNMX10
		 ERROR <Source is in use>
		CAIN A,RNMX12
		 ERROR <Rename to self is illegal>
		JRST JERR]
	JRST RLJFNS		;RELEASE THE JFNS
;.RESET RESET RESET2 RESE25 RESET3 RESE30 RESE31 RESE32 RESET4

;RESET

.RESET:	INTOFF
	SKIPL A,XFORK
	 KFORK
	SETOM XFORK

		;GET AND EDIT USE THE FOLLOWING AS A SUBROUTINE

RESET:	INTOFF
RESET2:	SETOM A
	CALL MAPPF		;UNMAP ANY PAGE
	CALL UNMAP		;INCLUDING BUFFER PAGES, ETC
;	MOVEI 1,-4
;	KFORK			;KILL ALL INFERIORS
;			DO NOT WANT TO KILL XFORK
	SKIPL A,EFORK	;KILL EPHEMERAL FORK IF STILL AROUND
	 KFORK
	SETOM EFORK
	SKIPGE A,IDFORK
	SKIPL A,FORK
	KFORK
	SETOM UFORK
	SETOM IDFORK
;	SETOM BDFORK
	SETOM LRFORK		;SAY THERE'S NO INFERIOR THAT'S BEEN RUN
	SETOM FORK		;SAY EXEC IS NOT POINTED AT ANY FORK
	SETZM PROPSF		;SAY THERE'S NO PROPRIETARY SUBSYSTEM
	SETZM DDTFLG		;SAY THERE'S NO DDT IN FORK

RESE25:	MOVEI 1,400001		;SCAN THROUGH ALL POSSIBLE HANDLES
	CAME A,XFORK	;NOT THE EXEC FORK
	RFRKH			;RELEASING THEM
	CAIGE 1,400017		;DID WE JUST DO THE LAST ONE?
	 AOJA 1,.-3		;NO, DO ANOTHER

RESET3:	SKIPG CREDIF		;ABANDONED PRIMARY INPUT FILE?
	 JRST RESE31		;NO
	HRRZ 1,CRJFNI
	GTSTS
	TLNN 2,(1B10)
	 JRST RESE30		;BAD JFN, FORGET IT
	TLNN B,(1B0)
	 JRST [	RLJFN		;NOT OPEN, JUST RELEASE IT
		 CALL JERR
		JRST RESE30]
	CLOSF
	 CALL JERR
RESE30:	SETZM CREDIF		;SAY INPUT NO LONGER REDIRECTED

RESE31:	SKIPG CREDOF
	 JRST RESET4
	HRRZ 1,CRJFNO
	GTSTS
	TLNN 2,(1B10)
	 JRST RESE32
	TLNN 2,(1B0)
	 JRST [	RLJFN
		 CALL JERR
		JRST RESE32]
	CLOSF
	 CALL JERR
RESE32:	SETZM CREDOF

;CLOSE ALL FILES OF INTERIOR FORKS
;AFTER KILLING FORKS, TO GET SHARED FILE JFN'S!
RESET4:	HRLI A,B1		;DON'T CLOSE THIS FORK'S FILES
	HRRI A,B0		;SELF
	CLZFF
	INTON
	RET

;"RUN" IS WITH "GET" ABOVE
;.SAVE SAVE1

;SAVE (CORE FROM) N (TO) N, (FROM) N (TO) N ... (ON) F

.SAVE:	SKIPGE FORK
	ERROR <No program>
	NOISE <core from>
	MOVEI B,1(P)		;WHERE "SAVE" ARGUMENT TABLE WILL BEGIN
SAVE1:  CALL OCTAL        ;INPUT OCTAL NUMBER AND SKIP
        JRST       [ALLOW TALT		;NO SKIP, NULL INPUT.
		MOVEI A,20		;ON ALT MODE GNLY, ASSUME 20.
                U$TYPE [ASCIZ /20 /]
                JRST .+1]
	ALLOW TSPC+TALT+TLPR
	PUSH P,A		;BUILD TABLE OF "SAVE" ARGUMENTS IN PUSHDOWN
        NOISE <to>
        CALL OCTAL
        JRST       [ALLOW TALT
                MOVEI A,-1
                U$TYPE [ASCIZ /777777 /]
                JRST .+1]
	SUB A,(P)
	JUMPL A,CERR		;MAX < MIN
	ADDI A,1
	TLNE A,1
	JRST [	MOVEI A,1B18		;FOR 0 TO 777777 LENGTH IS 1000000,
		HRLM A,(P)		;...WHICH IS MORE THAN 18 BITS,
		PUSH P,[B0,,B0]	;...SO USE TWO BLOCKS OF HALF SIZE.
		JRST .+2]
	HRLM A,(P)		;FORM LENGTH,,LOCATION
        CAIN TRM,","    ;COMMA AFTER SECOND ONE?
        JRST       [CALL SAVNOI		;SPECIAL HANDLING OF NOISE "FROM"
                JRST SAVE1]        ;GET ANOTHER PAIR
	ALLOW TSPC+TALT+TLPR+TLAN
        NOISE <on>
	TLZ Z,EOLNEF			;EOL JUST TRIGGERED [NEW FILE]
	HRROI A,[ASCIZ /SAV/]		;DEFAULT .SAV, NO NULL CASE.
        CALL COUTFN       ;COLLECT OUTPUT FILE NAME
	 JRST CERR
        CONFIRM
        ;TRANSFER DATA
	PUSH P,[0]		;TERMINATE TABLE
	HRL A,FORK
	HRR A,CJFN1
		;B ALREADY CONTAINS POINTER TO TABLE
	SAVE		;SAVE. IGNORES NON-EXISTENT OR 0 CORE.
	CALL RLJFNS		;RELEASE JFN.
	JRST CMDIN4		;CAN'T POPJ WITHOUT FLUSHING TABLE
;SAVNOI SAVNO1

;SAVNOI
;SUBROUTINE FOR SPECIAL HANDLING OF NOISE WORD "(FROM)" AFTER COMMA
; IN SAVE AND SSAVE COMMANDS:
;IF NEXT INPUT IS ALT MODE, TYPE OUT THE NOISE WORD.
;THIS IS BECAUSE PREVIOUS FIELD CAN'T END WITH ALT MODE - 
; ALT MODE MEANS SOMETHING DIFFERENT IN THIS CONTEXT.

SAVNOI:	PRINT " "		;SOME INDICATION THAT COMMA WAS ACCEPTED
	CALL CSTR		;PRE-READ NEXT FIELD
	TLO Z,BAKFF		;SAY RE-USE IT
	TRNN CBT,TALT		;DID IT END IN ALT MODE?
	JRST SAVNO1		;NO, MIGHT BE "(", IN WHICH CASE "NOISE" MACRO
		;WILL ALLOW USER TO TYPE IN NOISE WORD.
	CAILE CNT,1		;WAS IT NULL?
	RET		;NO, ITS NEXT ARG, NO "NOISE" MACRO NEEDED.
	TLZ Z,BAKFF		;ALT MODE ONLY, DON'T RE-USE, "NOISE" MACRO
		;WILL TYPE OUT NOISE.
SAVNO1:	NOISE (from)
	RET
;.SHUT

;SHUT (ALL OPEN FILES)

.SHUT:	NOISE <all open files>
	CONFIRM
;CLOSE ALL FILES BELONGING TO FORKS INFERIOR TO THIS EXEC.
	HRLI A,B1		;SAY DON'T CLOSE MY FILES
	HRRI A,B0		;SAY ME
	CLZFF
	RET
;.SSAVE SSAV1

;SSAVE (PAGES FROM) N (TO) N, (FROM) N (TO) N ... (ON) FILE
;SHARABLE SAVE, WITH READ-EXECUTE PAGE ACCESS.
;CODING SIMILAR TO "SAVE", SEE ITS COMMENTS.
;SHOULD WE CHECK THAT PAGES EXIST?

.SSAVE:	SKIPGE FORK
	ERROR <No program>
	NOISE <pages from>
	MOVEI B,1(P)		;WHERE TABLE WILL BEGIN IN PUSHDOWN
SSAV1:	CALL OCTAL
	 JRST [	ALLOW TALT
		MOVEI A,0
		U$TYPE [ASCIZ /0 /]
		JRST .+1]
	ALLOW TSPC+TALT+TLPR
	CAILE A,777
	JRST CERR
	PUSH P,A
	NOISE (to)
	CALL OCTAL
	JRST [	ALLOW TALT
		MOVEI A,777
		U$TYPE [ASCIZ /777 /]
		JRST .+1]
	SUB A,(P)		;FORM -# PAGES
	MOVN A,A		;..
	SUBI A,1		;..
	JUMPGE A,CERR
	HRLM A,(P)
;	MOVEI A,520		;READ-EXECUTE PERMIT, DUPLICATE ON WRITE
	MOVEI A,200		;AS CURRENT ACCESS!!!! (MGM 20-MAY-74)
	DPB A,[POINT 9,(P),26]		;PUT PROTECTION IN TABLE WORD
	CAIN TRM,","
	JRST [	CALL SAVNOI		;SPECIAL HANDLING OF NOISE "(FROM)"
		JRST SSAV1]
	ALLOW TSPC+TALT+TLPR+TLAN
	NOISE <on>
	TLZ Z,EOLNEF			;EOL JUST TRIGGERED [NEW FILE]
	HRROI A,[ASCIZ /SAV/]
	CALL COUTFN
	 JRST CERR
	CONFIRM
	PUSH P,[0]
	HRL A,FORK
	HRR A,CJFN1
	SETZ C,
	SSAVE
	CALL RLJFNS
	JRST CMDIN4
;.STOPS STOPS1

;STOPS N,N,N...
;SETS TERMINAL TAB STOPS TO INDICATED COLUMNS

.STOPS:	SETZB B,C		;CLEAR 3 AC'S IN WHICH TO ACCUMULATE
	SETZ D,		;...TAB STOP BITS IN SYSTEM FORMAT.
STOPS1:	CALL DECIN		;INPUT DECIMAL NUMBER
	 JRST CERR
	CAILE A,↑D107
	 JRST CERR
	ALLOW TCOM+TEOL+TSPC+TALT
	MOVE E,A
	IDIVI E,↑D36		;DIVIDE INTO WORD AND BIT NUMBERS
	HRLZI A,B0
	MOVN F,F
	LSH A,(F)		;POSITION BIT
	IORM A,B(E)		;MERGE INTO PROPER WORD
	TRNE CBT,TCOM
	JRST STOPS1		;AFTER COMMA GET ANOTHER
	CONFIRM
	MOVE A,COJFN
	STABS		;SET TABS FROM B, C, D.
	MOVEM B,PTTYMD+1		;PROGRAM TELETYPE MODES
	MOVEM C,PTTYMD+2
	MOVEM D,PTTYMD+3
	MOVEM B,ETTYMD+1		;AND EXEC'S TELETYPE MODES BLOCK
	MOVEM C,ETTYMD+2
	MOVEM D,ETTYMD+3
	RET
;$START .START ..STRT START1 START2

;START
;DECODE AND CHECK SUBROUTINE ALSO USED BY REDIRECT/DETACH

$START:	SKIPGE A,FORK		;HANDLE OF INFERIOR FORK, OR -1
	ERROR <No program>
	GEVEC
	HLRZ B,B
	CAIE B,<JRST>B53
	 JRST [	CAIGE B,1
		UERR [ASCIZ /No start address/]
		RET]
	MOVEI A,.JBSA
	CALL MAPPF
	TLNN A,B5
	ERROR <No page 0>
	TLNN A,B2
	ERROR <Page 0 read-protected>
	MOVEI A,.JBSA
	HRRZ A,PAGEN(A)
	JUMPE A,[UERR [ASCIZ /No start address/]]
	RET

;START COMMAND DISPATCHES HERE

.START:	CALL $START
	CONFIRM
;"RUN" JOINS HERE
;REDIRECT/DETACH...(AND) START  JOINS HERE

..STRT:	MOVNI B,1		;START CODE FOR PA1050
	CALL CHKPAT
	JUMPG B,.+2		;PA1050 START IF POSITIVE
	SETZ B,		;ENTRY VECTOR INDEX 0 FOR START

;"EDIT" ENTRY
START1:	MOVEI E,PTTYMD
	CALL LTTYMD		;SET PGM TTY MODES

;START FORK WHOSE HANDLE IS IN "FORK" USING ENTRY VECTOR INDEX IN B.
;"REENTER" JOINS HERE.

START2:	TLO Z,RUNF		;SAY PROGRAM'S TTY MODES ARE IN EFFECT
	SETO A,		;DON'T WANT ANY MAPPED PAGES WHILE RUNNING PROG,
	CALL MAPPF		;SO CLEAR BUFFER "PAGEN".
	CALL IFORK		;PREPARE FORK(S) AND SETUP LRFORK
	CAIL B,1000		;PROPER ENTRY VECTOR DISPATCH?
	JRST [	TLNN B,1	;DON'T START IF LH NON-0
		SFORK		;NO, PA1050 OR OTHER SPECIAL START
		JRST WAIT]
	SFRKV		;START FORK USING ENTRY VECTOR (USES A,B)
;WAIT WAIT2

;START AND REENTER...
;CONTINUE AND GOTO JOIN HERE.
;ANY OF THE ABOVE WITH REDIRECT OR DETACH ALSO GET HERE.
;WAIT FOR FORK TO TERMINATE, AFTER DETACHING TERMINAL IF "DTACHF" ON.

WAIT:	TLNE Z,DTACHF		;"DETACH" COMMAND?
	DTACH			;YES, DETACH CONTROLLING TERMINAL.

	MOVE A,LRFORK		;INFERIOR BEING RUN
	RFORK			;RESUME
	WFORK			;WAIT
	INTOFF
	MOVE A,LRFORK
	FFORK			;FREEZE IT IMMEDIATELY
	MOVE B,[CALL CUUO]	;SET UUO DISPATCH TO FRUSTRATE
	MOVEM B,41		;MALICIOUS USERS

	PUSH P,A
	MOVEI A,.JBERR		;TAKE CARE OF ERROR COUNT
	CALL MAPPF
	TLNN A,B5
	 JRST WAIT2
	TLNN A,B2
	 JRST WAIT2
	MOVE A,PAGEN(A)
	ADDM A,.JBERR
WAIT2:	SETO 1,
	CALL MAPPF
	POP P,A

	MOVEI E,PTTYMD		;SAVE TTY MODES, AS MODIFIED BY PROGRAM
	CALL RTTYMD		;..
	TLZ Z,RUNF		;SAY PROG'S TTY MODES NOT IN EFFECT
	MOVEI E,ETTYMD		;RESTORE EXEC'S TTY MODES
	CALL LTTYMD		;..

;ANALYZE REASON FOR TERMINATION

	RFSTS
	TLZ A,(1B0)		;FLUSH FROZEN BIT
	CAMN A,[2B17]		;VOLUNTARY TERMINATION IS NORMAL
	 JRST [	INTON
		JRST CMDIN2]	;GO INPUT COMMAND
	TLNE A,077700		;DISTINGUISH -1 FROM 0-5, 400000-400005.
	 JRST [	SETOM FORK	;-1 = UNASSIGNED HANDLE, SAY NO FORK.
		SETOM LRFORK	;..DOES THIS HAPPEN IF IT KFORKS ITSELF,
		INTON
		UERR [ASCIZ /Program killed itself/]];OR IS IT SCREWUP?
	PUSH P,A
	INTON
	POP P,A
;INVOLT WHY IFORK CHKPAT

;START AND REENTER ETC...
;NON-VOLUNTARY TERMINATION
;ALSO USED FOR UNUSUAL TERMINATION OF EPHEMERON
INVOLT:	JUMPL A,[CALL SCREWUP]
	HLRZ C,A
	CAIE C,3		;FORCED TERMINATION (UNENABLED ERROR PSI)
	CALL SCREWUP
	MOVEI A,(A)		;MASK PSI CHANNEL THAT CAUSED IT
	CAIG A,↑D35		;CHECK AGAINST TABLE LIMITS
	CAIGE A,0		;..
	CALL SCREWUP
;MESSAGE TABLE ADDRESSED BY FOLLOWING LOC ALSO USED BY "RUNSTAT".

WHY:	XCT .+1(A)		;ERROR MESSAGE FROM TABLE FOLLOWING
	 ERROR <Chan %1Q interrupt at %2P>; CHAN 0. THESE HAPPEN IF
	 ERROR <Chan %1Q interrupt at %2P>; PROGRAM ACTIVATES CHANNEL
	 ERROR <Chan %1Q interrupt at %2P>; BUT DOES NO EIR OR SIR OR
	 ERROR <Chan %1Q interrupt at %2P>; HAS 0 TABLE WD FOR CHANNEL.
	 ERROR <Chan %1Q interrput at %2P>; CHAN 4
	 ERROR <Chan %1Q interrput at %2P>; CHAN 5
	 ERROR <Overflow at %2P>; CHAN 6. %2P => TYPE PC FROM RH B OCTAL
	 ERROR <Floating overflow at %2P>; CHAN 7
	 ERROR <Chan %1Q interrupt at %2P>; CHAN 8
	 ERROR <Pushdown overflow at %2P>; CHAN 9
	 ERROR <End-of-file at %2P>; CHAN 10
	 ERROR <IO data error at %2P>;
	 ERROR <Chan %1Q interrupt at %2P>; CHAN 12 "FILE CONDITION 3"
	 ERROR <Chan %1Q interrupt at %2P>; CHAN 13 "FILE CONDITION 4"
	 ERROR <Chan %1Q interrupt at %2P>; CHAN 14. TIME OF DAY.
	 ERROR <Illegal instruction %2X>; %X:INST "AT" PC, SYS MSG IF JSYS
	 ERROR <Illegal memory read at %2P>
	 ERROR <Illegal memory write at %2P>
	 ERROR <Illegal memory execute at %2P>
	 ERROR <Fork termination interrupt at %2P>; CHAN 19
	 ERROR <Disk space allocation exceeded at %2P>
	 REPEAT ↑D15,<ERROR <Chan %1Q interrupt at %2P>
>		;CHAN 21-35

;PREPARE INFERIOR FORK STRUCTURE, CALLED BY GOTO AND START

IFORK:	MOVE A,FORK
	MOVEM A,LRFORK		;RETURN THIS  IN A
	RET

;ROUTINE TO SETUP FORK IF PA1050 HAS BEEN INVOKED. START, REENTER,
; GOTO, AND DDT ALL GO TO PA1050 INSTEAD OF THE PROGRAM.
; THE PREVIOUS FORK PC IS ALSO GIVEN TO PA1050, AND IT IN TURN
; FINDS THE PROGRAM'S OLD PC, SETS UP .JBOPC, AND STARTS THE PGM.
; WORD 6 OF THE PA1050 ENTRY VECTOR IS THE START LOCATION FOR THIS.
; LH OF WORD 7 IS WHERE TO STORE FUNCTION CODE: -1 START, -2 REENTER,
;  -3 DDT, +N GOTO N
; RH OF WORD 7 IS WHERE TO STORE FORK'S OLD PC

CHKPAT:	PUSH P,B		;SAVE CODE WORD
	PUSH P,C
	MOVE A,FORK
	GCVEC			;PA1050 ENTRY VECTOR
	HLRZ C,B		;CHECK FOR LENGTH GREATER THAN 8
	CAIGE C,1000		;WHICH ELIMINATES OLD PA1050 VERSIONS
	CAIGE C,10		;AS WELL AS NON-PA1050 PGMS.
	JRST [	POP P,C
		POP P,B
		RET]
	MOVEI A,6(B)
	CALL LOADF		;GET PA1050 RESTART LOC
	EXCH A,-1(P)		;SAVE IT, GET CODE WORD
	PUSH P,A
	MOVEI A,7(B)
	CALL LOADF		;GET PTRS FOR RESTART DATA
	PUSH P,A
	MOVE A,FORK
	RFSTS			;GET FORK'S OLD PC
	HLRZ A,A
	CAIE A,400002		;HALT OR FORCE TERM?
	CAIN A,400003
	JRST [	MOVE A,FORK	;YES, MUST RESTART FORK
		SFORK
		JRST .+1]
	HRRZ A,0(P)		;PTR TO CELL FOR IT
	CALL STOREF		;STORE OLD PC IN PA1050 VARIABLE AREA
	POP P,A
	HLRZ 1,1		;PTR TO CELL FOR CODE WORD
	POP P,B			;CODE WORD
	CALL STOREF		;STORE IT
	POP P,C
	POP P,B			;RETURN PA1050 RESTART LOC IN B
	MOVNI A,0(B)		;IF RH OF WD 6 IS .L. 36, IT IS
	CAMG A,[-↑D36]		;PSI CHANNEL TO BE GOOSED RATHER THAN
	RET			;A RESTART LOCATION
	MOVSI B,(1B0)		;COMPUTE PROPER BIT
	LSH B,0(A)
	MOVE A,FORK
	AIC			;BE SURE CHANNEL ON AND PSI ON
	EIR
	IIC
	MOVSI B,1		;RETURH LH NON-0 TO PREVENT SFORK
	RET
;.UNDEL UNDEL1 UNDEL8

;"TYPE" AND "LIST" ARE IN A SEPARATE FILE BELOW.

;UNDELETE <DELETED FILE NAMES>

.UNDEL:	NOISE (files)
	MOVE A,[2,,2]	;DEFAULT NAME AND EXT TO PRECEDING ONES IN GRP
	MOVEI B,B2+B8+B11+B15+B16 ;"MUST BE NEW" AND "IGNORE DELETED BIT"
	CALL SPECFN		;INPUT FILE NAME USING GTJFN FLAGS IN B
	 JRST CERR		;NO DEFAULT FOR NULL INPUT
	ALLOW TSPC+TALT+TEOL
	CONFIRM
UNDEL1:	HRRZ A,@INIFH1		;JFN
	DVCHR
	TLNN B,B4		;MULT DIR DEVICE?
	ERROR <You can't undelete non-disk files>
	HRRZ A,@INIFH1
	MOVE B,[1,,FDBCTL]	;CONTROL BITS WORD OF FILE DESC BLOCK
	MOVEI C,C		;READ INTO C
	CALL $GTFDB		;DO GTFDB JSYS, NO SKIP IF NO ACCESS
	SETO C,		;NO ACCESS, ASSUME DELETED
	TLNN C,<FDBDEL>B53		;"FILE IS DELETED" BIT
	JRST [	TLNN Z,GROUPF		;SKIP IF GROUP BEING PROCESSED
		UERR [ASCIZ /Not deleted/]; ERROR IF NOT GROUP
		JRST UNDEL8]		;IN GROUP JUST SKIP THOSE ALREADY DLTED
	CALL TYPIF		;TYPE NAME IF GROUP
	HRLI A,FDBCTL		;1: DISPLACEMENT,,JFN
	HRLZI B,<FDBDEL>B53		;MASK OF BITS TO CHANGE
	SETZ C,		;VALUE TO CHANGE TO: OFF.
	CHFDB		;CHANGE FILE DESCRIPTOR BLOCK
UNDEL8:	CALL GNFIL		;GET JFN OF NEXT FILE OF GROUP
	JRST RLJFNS		;NO MORE, RELEASE JFN, GO GET NEXT COMMAND.
	JRST UNDEL1		;HAVE ANOTHER
;.UNMOU

;UNMOUNT <DEVICE>

.UNMOU:	NOISE (device)
	CALL DEVN
	TLNN B,B7
	ERROR <%1H: not a mountable device>
	TLNN B,B5
	JRST [	TLNN B,B6
		UERR [ASCIZ /%1H: not available/]
		UERR [ASCIZ /%1H: assigned to job %3Q/]]
	TLNN B,B8
	ERROR <%1H: not mounted>
	CONFIRM
	DSMNT
	 CALL JERR
	RET
;.UNLOA .REWIN

;UNLOAD AND REWIND COMMANDS

.UNLOA:	MOVEI F,11		;MTOPR UNLOAD FUNCTION
	CAIA
.REWIN:	MOVEI F,1		;MTOPR REWIND FUNCTION
	NOISE (device)
	CALL DEVN		;GET A DEVICE NAME
	TLNN B,B5		;AVAILABLE?
	JRST [	TLNN B,B6
		UERR [ASCIZ /%1H: not available/]
		UERR [ASCIZ /%1H: assigned to job %3Q/]]
	LDB C,[POINT 9,A,17]	;GET DEVICE TYPE
	CAIE C,3		;IS IT DECTAPE?
	CAIN C,2		;OR MAG TAPE?
	CAIA			;YES
	 ERROR < must be DECtape or magtape>
	CONFIRM
	TLO A,40000		;NO DIRECTORY (FOR DECTAPE)
	MOUNT
	 CALL JERR
	HRRZ D,A		;GET UNIT NUMBER
	LSH D,↑D8
	IOR D,[ASCII /DTA0:/]	;FOR DEVICE NAME STRING
	CAIE C,3		;DECTAPE?
	TLO D,(<"MTA0:"-"DTA0:">←1)	;NO, MAKE IT MAG TAPE
	MOVSI A,1		;SHORT FORM GTJFN
	HRROI B,D		;NAME STRING POINTER
	MOVEI E,0		;MAKE NAME STRING ASCIZ
	GTJFN
	 CALL JERR
	MOVE B,[17B9+1B19]	;DUMP MODE, READ
	OPENF
	 CALL JERR
	MOVE B,F		;MTOPR FUNCTION
	MTOPR
	CLOSF
	 CALL JERR
	RET
;.WHERE WHERE1 WHERE2 WHERE4 WHERE5 WHER51 WHER52 WHER58 WHERE6 WHERE7 WHERE8 WHERE9 LITC3

;WHERE (IS USER) <NAME>

.WHERE:	NOISE <is user>
	CALL DIRNAM		;INPUT DIR (USER) NAME WITH RECOGINITION
	TLNE A,B0
	 JRST CERR		;NOT LOG-IN-UNDER-ABLE
	ALTYPE ( )
	ALLOW TEOL+TSPC+TALT
	CONFIRM		;NEEDED EVEN THOUGH ITS A NON-CONFIRMATION CMD!
	SETZ C,		;SETUP FOR NOT HERE
	PUSH P,A
	MOVE A,['JOBDIR']
	CALL $SYSGT		;GET LENGTH OF TABLE AND NUMBER
	HLLZ D,B		;NEG LENGTH FOR AOBJN
	MOVEI E,0(B)		;TABLE NUMBER
WHERE1:	GTB 0(E)		;GET AN ENTRY FROM TABLE
	XOR A,(P)		;COMPARE
	MOVEI A,(A)		;...MASK RIGHT HALF
	JUMPN A,WHERE9
;MATCH FOUND, USE TABLE 0 TO CONVERT JOB # TO TTY #
	HRLZ A,D
	GETAB
	 CALL JERR
	MOVEI B,0(D)		;JOB NUMBER
	JUMPE B,WHERE9		;DONT SHOW JOB 0
	JUMPL A,[ETYPE < Detached, job %2Q>
		PUSHJ P,SYST8X
		JRST WHERE2]
	HLRZ A,A
	ETYPE < TTY%1O%, job %2Q>
	PUSHJ P,SYST8X	;CONN DIR
	PUSHJ P,WHERE4	;4N HOST
WHERE2:	MOVE A,COJFN
	MOVEI B,","
	BOUT
	MOVEI B," "
	BOUT
	JRST WHERE7

;
; ALSO CALLED FROM SYSTAT
;
;PRINT FOREIGN HOST NAME IF A NETWORK TTY
WHERE4:	PUSH P,A		;SAVE TTY# TO COMPARE AGAINST
	MOVE A,['LHOSTN']
	CALL $SYSGT
	JUMPE B,WHERE6		;TABLE DOES NOT EXIST??
	HRLI A,1		;TABLE INDEX
	HRR A,B			;TABLE NUMBER
	GETAB
	 JRST WHERE6
	HLRE B,A		;MINUS THE NUMBER OF NET TTY'S
	MOVMS B
	HRRZS A			;LOWEST NUMBERED NET TTY
	ADD B,A			;1 + HIGHEST NUMBERED NET TTY
	CAMG A,0(P)		;REJECT IF TTY# .LE. LOWEST NET TTY
	CAMG B,0(P)		;REJECT IF HIGHEST+1 .LE. TTY#
	 JRST WHERE6
	MOVE A,['NETBUF']
	CALL $SYSGT
	JUMPE B,WHERE6		;NO SUCH TABLE??
	HLLZ F,B		;MAKE AOBJN PTR
	HRRZ G,B		;SAVE TABLE NUMBER

WHERE5:	HRR A,G			;TABLE NUMBER
	HRL A,F			;INDEX UNDER CONSIDERATION
	GETAB
	 CALL JERR
	XOR A,0(P)		;COMPARE
	HRRZS A			;JUST RIGHT HALF
	JUMPN A,WHER58		;TTY# DOES NOT MATCH, TRY NEXT ENTRY

WHER51:	MOVE A,['NETSTS']
	CALL $SYSGT
	JUMPE B,WHERE6		;TABLE DOESN'T EXIST??
	HRR A,B			;TABLE NUMBER
	HRL A,F			;INDEX
	GETAB
	 CALL JERR
	TLC A,340000		;LOOK FOR 7 IN LEFT 4 BITS
	TLNE A,740000
	JRST WHER58		;NOT IN THE RIGHT STATE

WHER52:	MOVE A,['NETAWD']	;FOUND MATCH
	CALL $SYSGT		;NOW GET THE FOREIGN HOST NUMBER
	JUMPE B,WHERE6		;TABLE DOES NOT EXIST??
	HRR A,B			;TABLE NUMBER
	HRL A,F			;INDEX
	GETAB
	 CALL JERR
	LDB B,[POINT 9,A,17]	;FOREIGN HOST NUMBER

	MOVE A,COJFN		;OUTPUT JFN
	PRINT "["
	MOVEI C,↑D10		;IN CASE NOUT IS NEEDED
	CVHST			;HOST TO STRING CONVERSION
	 NOUT			;DON'T KNOW THAT HOST, PRINT AS NUMBER
	  JFCL			;STRING PRINTED OR SCREWY NOUT(??)
	PRINT "]"
	JRST WHERE6

WHER58:	AOBJN F,WHERE5		;TRY NEXT NETBUF TAB ENTRY

WHERE6:	SUB P,[1,,1]		;FLUSH SAVED TTY#
	POPJ P,


;PRINT SUBSYSTEM NAME
WHERE7:	MOVE A,['JOBNAM']
	CALL $SYSGT
	JUMPE B,WHERE8
	HRR A,B
	HRL A,D
	GETAB
	 CALL JERR
	MOVE C,A
	MOVE A,['SNAMES']
	CALL $SYSGT
	 JUMPE B,WHERE8
	HRR A,B
	HRL A,C
	GETAB
	 CALL JERR
	JUMPE A,[	PRINT "?"
		JRST WHERE8]
	CALL SIXPRT	;PRINT IT
WHERE8:	PRINT EOL
	SETO C,		;SAY AT LEAT ONE FOUND
;AFTER TYPING CONTINUE LOOP IN CASE HE HAS SEVERAL JOBS.

WHERE9:	AOBJN D,WHERE1
	SKIPN C
	UTYPE [	ASCIZ / Not logged in
/]
	JRST CMDIN4

	XLIST
LITC3:	LIT		;LITERALS HERE TO REDUCE WORKING PAGE SET --
	LIST

SUBTTL PDP-10 TENEX EXECUTIVE  ** X2CMD.MAC **

;ROUTINES TO DECODE AND EXECUTE SPECIFIC COMMANDS.
;THIS FILE CONTAINS SEVERAL OF THE LONGER AND NOT PARTICULARLY COMMON
;COMMANDS.  THEY ARE SEGREGATED FROM THE OTHER, SHORTER, COMMAND
;ROUTINES TO REDUCE THE EXEC'S NORMAL WORKING PAGE SET.

;CONTENTS
;	COPY/APPEND
;	LIST/TYPE
;	REDIRECT/DETACH

;COPY COMMAND:  COPY <FILE GROUP> (TO) <FILE>
;AND
;APPEND COMMAND:  APPEND <FILE GROUP> TO <FILE>

;TAKE SUBCOMMANDS.

;MODE SUBCOMMAND --   LEGAL FOR--	MODE-BYTESIZE USED--
;ASCII		ANY DEVICES		1-7 WHERE LEGAL, ELSE 0-7
;IMAGE		ONE DEVICE MUST ACCEPT	10-8 WHERE LEGAL, ELSE 0-8
;		MODE 10, OTHER MUST
;		NOT BE LPT:.
;IMAGE BINARY	NEITHER DEVICE CAN	13-36 WHERE LEGAL, ELSE 0-36
;		BE TTY: OR LPT:
;BINARY		NEITHER DEVICE CAN	14-36 WHERE LEGAL, ELSE 0-36
;		BE TTY: OR LPT:.
;ASCII PARITY	PAPER TAPE SOURCE	SEE ASCII	NOT IMPLEMENTED
;DUMP		NON-DIRECTORY DTA OR MTA		NOT IMPLEMENTED

;FLAGS IN LH Z
;F1 ON FOR PAGES COPY, OTHERWISE OFF
;F2 ON FOR APPEND, OFF FOR COPY
;F3 ON IF OUTFILE WAS ALREADY OPEN (GROUP SOURCE CASE)

;FLAGS IN RH Z
;BITS FOR MODES SPECIFIED BY SUBCOMMANDS
; B35-N ON FOR MODE N, AS IN DVCHR WORD. THAT IS:
;1	NORMAL - SET IF BYTE SIZE SPECIFIED
;2	ASCII
;400	IMAGE
;4000	IMAGE BINARY
;10000	BINARY
;100000 DUMP

;AC USE
;AA  -1 OR BYTE SIZE AND MODE OF PREVIOUS COPY IN GROUP TO SAME DEST
;BB  - # BYTES PER PAGE WHEN COPYING BY BYTES
;CC  BYTE # OF EOF OF DISK SOURCE, # BYTES COPIED TO DSK DEST
;C, D, E, F   SEE 2 PAGES HENCE
;A, B, AND G ALSO USED LOCALLY
;.TTYPE .PRINT TTPRNT .APPEN .COPY COP1A COPFL

.TTYPE:	NOISE <file list>
	MOVE A,['E COPY']
	SETNM
	CALL .INFG
	HRROI 2,[ASCIZ /TTY:/]
	JRST TTPRNT

.PRINT:	NOISE <file list>
	MOVE A,['E COPY']
	SETNM
	CALL .INFG
	HRROI 2,[ASCIZ /LPT:/]
TTPRNT:	MOVSI A,400001
	GTJFN
	 JRST CERR
	MOVE B,JBUFP
	PUSH B,A
	MOVEM B,JBUFP
	MOVEM A,OUTDSG
	JRST COP1A

;COPY/APPEND

.APPEN:	TLO Z,F2		;SAY APPEND NOT COPY
.COPY:	NOISE <file list>	;F2 IS OFF
	MOVE A,['E COPY']
	SETNM

;DECODE: GET FILE NAMES THEN SUBCOMMANDS
	CALL .INFG		;GET INPUT FILE GROUP DESCRIPTOR
		;ALLOWS *'S, AND COMMAS IF THEY ARE
		;IMMEDIATE FILE NAME TERMINATOR.
	ALLOW TSPC+TALT+TLPR
	NOISE <to>
	MOVE A,[2,,2]	;SAY DEFAULT NAME AND EXT TO THOSE OF INPUT FILE
	MOVEI B,(1B0+1B3)	;NORMAL OUTPUT FILE FLAGS FOR "COPY"
	TLNE Z,F2		;SKIP IF "COPY" NOT "APPEND"
	MOVEI B,(1B3)		;PRINT NEW FILE, ETC.
	CALL SPECFN		;COLLECT FILE NAME, GTJFN FLAGS IN RH B.
	 JRST CERR		; NO DEFAULT FOR "-" INPUT
	MOVEM A,OUTDSG		;DESTINATION JFN
		;TRZ Z,-1	;CLEAR ALL SUBCOMMAND BITS (NEEDED ←←←←←?)
	TLNN Z,F2
	JRST COP1A
		;MAKE SURE DESTINATION DEVICE IS OK FOR "APPEND"
	HRRZ A,OUTDSG
	DVCHR
	LDB D,[POINT 9,B,17]
		;NO OTHER DEVICES WORK 12/3/70
	JUMPN D,[UERR[ASCIZ/Destination file must be on disk/]]
COP1A:	CALL SPRTR		;ANALYZE TERMINATOR, READING MORE IF NEC. 3 RETS
	 JRST CERR
	 JRST [	CONFIRM		;COMMA. GET SUBCOMMANDS
		SUBCOM $COPY		;SUBCOMMANDS FROM TABLE $COPY
		JRST .+2]
	CONFIRM
	SETO AA,		;SAY NO PREVIOUS COPY IN GROUP
;TOP OF LOOP OVER INPUT FILE NAMES

COPFL:	CALL TYPIF		;TYPE INPUT FILE NAME IF PROCESSING GROUP
;WHEN OUTPUT FILE GROUP DESCRIPTORS IMPLEMENTED, DETERMINE HERE
;THE DESTINATION, AND SETO AA, UNLESS THE SAME AS BEFORE.
;CHOOSE MODE AND BYTE SIZE FOR COPY/APPEND AS A FUNCTION OF 
;DEVICES AND SUBCOMMANDS GIVEN.

;AC USE
; C: SOURCE DEVICE TYPE NUMBER
; D: DESTINATION DEVICE TYPE NUMBER
; RH E: BYTE(6) READ MODE,WRITE MODE,BYTE SIZE
; F: DISC SOURCE BYTE SIZE

;SET UP E PER SUBCOMMAND, IGNORING FOR THE MOMENT WHETHER MODE
; IS LEGAL FOR DEVICES.
	TRNN Z,1		;BYTE SIZE GIVEN MEANS MODE 0
	SETZ E,		;FOR NO SUBCOMMAND, BYTE SIZE IS DEFAULTED LATER
	TRNE Z,2
	MOVEI E,010107
	TRNE Z,400
	MOVEI E,101010
	TRNE Z,4000
	MOVEI E,131344
	TRNE Z,10000
	MOVEI E,141444
;COP2A

;COPY/APPEND...
;DETERMINING MODE-BYTESIZE...
;FOR EACH FILE, DO A "DVCHR" TO GET TYPE NUMBER AND TO SEE IF MODE
; IS LEGAL FOR DEVICE.  CHANGE MODE TO 0 IF NOT LEGAL.
;DESTINATION
	HRRZ A,OUTDSG
	DVCHR
	TLNN B,B0
	ERROR <%1H: can't do output>
	LDB D,[POINT 9,B,17]
	TRZ B,600000
	TRNN Z,(B)		;SKIP IF MODE SUBCOM GIVEN & OK FOR THIS DEVICE
	JRST [	TRZ E,007700		;WRITE IN MODE 0
		TRNN B,1		;CAN DEVICE USE MODE 0 ?
		UERR [ASCIZ /%1H: can't do normal mode output/]
		JRST .+1]
;SOURCE
	HRRZ A,@INIFH1
	DVCHR
	TLNN B,B1
	ERROR <%1H: can't do input>
	LDB C,[POINT 9,B,17]
	TRZ B,600000
	TRNN Z,(B)		;SUBCOMMAND GIVEN & OK ?
	JRST [	TRZ E,770000		;READ IN MODE 0
		TRNN B,1		;CAN DEVICE USE MODE 0?
		UERR [ASCIZ /%1H: can't do normal mode input/]
		JRST .+1]
		;ALSO FOR DISK SOURCE GET BYTE SIZE IN F
	JUMPN C,COP2A
	HRRZ A,@INIFH1
	MOVE B,[1,,FDBBYV]		;BYTE SIZE IN B6-11
	PUSH P,C
	MOVEI C,F
	CALL $GTFDB		;DO GTFDB, NO SKIP ON NO ACCESS
	ERROR <Access to source not allowed>
		;SHOULD BE FIXED AT MONITOR LEVEL ←←←←← PUSH RST ←←←←←
	POP P,C
	LDB F,[POINT 6,F,11]
COP2A:
;COP3

;COPY/APPEND...
;DETERMINING MODE-BYTESIZE...

;IF MODE SUBCOMMAND IS ACCEPTABLE TO ONE DEVICE,
;IT IS ACCEPTED AND MODE 0 USED FOR OTHER DEVICE, PROVIDED OTHER
; DEVICE WILL ACCEPT THE BYTE SIZE (ONLY TTY AND LPT ARE RESTRICTED).
;IF MODE IS ACCEPTABLE TO NEITHER, ACTION DEPENDS ON SUBCOMMAND;
; IF UNACCEPTABLE A WARNING MESSAGE IS TYPED AND DEFAULT EXECUTION
; PROCEEDS, SO THAT A WHOLE GROUP COPY DOESN'T GET ABORTED.

	TRNN Z,177777		;ANY MODE SUBCOMMANDS GIVEN?
	JRST COPDEF		;NO, GO DEFAULT MODE AND BYTE SIZE
	TRNN Z,1		;MODE 0 REQUESTED, OR
	TRNE E,777700		;EITHER MODE NON-0?
	JRST COP3		;YES, SUBCOMMAND ACCEPTABLE TO ONE DEVICE
;SUBCOMMAND-DEPENDENT ACTION FOR SBCMD WHOSE MODE IS LEGAL FOR
;NEITHER SOURCE NOR DESTINATION DEVICE
	TRNE Z,2
	JRST [	MOVEI E,7		;ASCII ALWAYS LEGAL, USE 0-7.
		JRST COP3]
	TRNN Z,4000		;TREAT "IMAGE BINARY" AS "BINARY"
	TRNE Z,10000
	JRST [	MOVEI E,44		;"BINARY", USE 0-36, LEGAL EXCEPT FOR
		JRST COP3]		;TTY OR LPT, DETECTED AT COP3.
		;ONLY IMAGE GETS THRU TO HERE
	JRST COPDF1		;GO TYPE MESSAGE AND DEFAULT
		;IMAGE IS NOT INTERPRETED FOR DEVICES OTHER THAN PAPER
		;TAPE BECAUSE ITS BYTE SIZE WILL PRESUMABLY BE
		;DIFFERENT WHEN IT IS DEFINED FOR OTHER DEVICES.
;IF HERE, ALL SET EXCEPT SUBCOMMAND MAY HAVE SPECIFIED A BYTE SIZE
;ILLEGAL FOR DEVICE. CHECK FOR THAT.

COP3:	LDB B,[POINT 6,E,35]		;CHOSEN BYTE SIZE
	CAIE C,12
	CAIN D,12
	JRST [	CAIE B,7		;TTY TAKES 7 OR 8 ONLY
		CAIN B,10
		JRST .+1
		JRST COPDF1]		;TYPE MESSAGE AND DEFAULT
	CAIN D,7		;LPT TAKES 7 ONLY
	CAIN B,7
	JRST COP4		;ALL IS OK
		;JRST COPDF1
;COPDF1 COPDEF

;COPY/APPEND...
;DETERMINING MODE-BYTESIZE...   DEFAULT CASE...
;NO ACCEPTABLE SUBCOMMAND GIVEN.
;DEFAULT MODE AND BYTE SIZE AS A FUNCTION OF DEVICES USED.
;MODE ALWAYS 0 AT PRESENT.

COPDF1:	TYPE < [Illegal mode subcommand being ignored]
>
COPDEF:	JUMPN D,.+3
	JUMPN C,.+2
		;DISK TO DISK USES SOURCE BYTE SIZE
	SKIPA E,F		;DISK SOURCE BYTE SIZE IS IN F
		;MOST OTHER CASES USE 0-36
	MOVEI E,↑D36
		;IF TTY: OR LPT: INVOLVED, USE 0-7
	CAIE C,12
	CAIN D,12
	JRST .+2
	CAIN D,7
	JRST [	MOVEI E,7
		JRST COP4]
;COPDF3 COPDF4 COPDF5 COPDF6 COP4

;COPY/APPEND...
;DETERMINING MODE-BYTESIZE...   DEFAULT CASE...
;SPECIAL CASES FOR PAPER TAPE
	CAIE C,4		;PTR
	JRST COPDF3
	CAIN D,5		;PTP
	JRST [	MOVEI E,↑D8		;USES 0-8 TO DUPLICATE PAPER TAPE
		JRST COP4]
	HRRZ B,OUTDSG		;PTR TO OTHER DEVICES DEPENDS ON DEST EXT
	JRST COPDF4
COPDF3:	CAIE D,5		;PTP
	JRST COPDF6
	JUMPE C,[MOVE E,F		;DSK TO PTP
		CAIN F,7		;IF SC BYTE SIZE 7, USE IT, NO MESSAGE.
		JRST COP4
		CAIE F,10		;IF 8, USE IT, TYPE MESSAGE
		MOVEI E,↑D36		;OTHERWISE ASSUME 36 AND TYPE MESSAGE
		JRST COPDF5]		;NOTE THAT CAN'T TRUST SIZE OF 36 IN
		;FILE BECAUSE OTHER SIZES CAN BECOME
		;36 IF FILE IS COPIED TO DTA AND BACK.
	HRRZ B,@INIFH1		;OTHER DEVICES TO PTP, DEPENDS ON SC EXT
COPDF4:		;ONE IS PAPER TAPE, OTHER ISN'T. USE 0-36 FOR FILES
		;WITH EXTENSION OF .REL OR .SAV, 0-7 FOR OTHERS.
		;TYPE MESSAGE.  JFN OF NON-PAPERTAPE DEVICE NOW IN B.
	MOVE A,CSBUFP
	HRROI A,1(A)		;BEGINNING OF NEXT WORD OF STRING BUFFER
	SETZM (A)
	PUSH P,C
	HRLZI C,B11
	JFNS
	POP P,C
	MOVE A,CSBUFP
	MOVE A,1(A)		;FIRST WORD OF EXTENSION STRING
	CAME A,[ASCIZ /REL/]
	CAMN A,[ASCIZ /SAV/]
	JRST .+2		;REL OR SAV, USE 36 (ALREADY IN E)
	MOVEI E,7		;OTHER EXT OR NON-DIR DEVICE, USE 0-7
		;A MARGINAL ASSUMPTION HAS BEEN MADE ABOUT PAPER TAPE,
		;TYPE EXPLANATORY MESSAGE.
COPDF5:	TYPE < [>
	CAIN E,7
	TYPE <ASCII>
	CAIN E,10
	TYPE <Image>
	CAIN E,44
	TYPE <Binary>
	TYPE < mode assumed]
>
		;JRST COP4
COPDF6:		;ADD CASES TO THE DEFAULTING STUFF HEHE
COP4:		;NOW HAVE MODES AND BYTE SIZE IN E
;COP5A COP5B

;COPY/APPEND...
;HAVE FINISHED CHOOSING MODE-BYTESIZE.
;OPEN FILES NOW, SO FFUFP WILL WORK.
		;SOURCE
	MOVEI B,1B19		;READ BIT FOR OPENF
	LDB A,[POINT 6,E,23]		;GET READ MODE FROM E
	DPB A,[POINT 4,B,9]
	LDB A,[POINT 6,E,35]		;BYTE SIZE
	DPB A,[POINT 6,B,5]
	HRRZ A,@INIFH1		;JFN
	CALL $OPENF		;OPENF WITH CHECK FOR PRI IO FILES 
		;AND FANCY ERROR MESSAGES
		;DESTINATION
	HRRZ A,OUTDSG
	GTSTS
	JUMPGE B,COP5A
		;DEST ALREADY OPEN, ITS ANOTHER COPY IN GROUP, SEE IF
		;MODE-BYTESIZE CONSISTENT, CHANGE WHERE POSSIBLE
	TLO Z,F3		;SAY IT WAS ALREADY OPEN
	MOVE B,E		;MODES-BYTESIZE CHOSEN FOR THIS COPY
	XOR B,AA		;COMPARE TO THOSE USED FOR LAST COPY
	TRNN B,7777		;OUTPUT MODE & SIZE THE SAME?
	JRST COP5B		;YES, ALL IS OK
	JUMPN D,.+2		;IF DEST NOT DSK, CHANGE ILLEGAL
	TRNE B,7700		;FOR DSK SIZE CAN CHANGE BUT MODE CAN'T
	ERROR <Illegal mode or byte size change,
 multiple-source copy cannot proceed>
	LDB B,[POINT 6,E,35]
	SFBSZ
	JRST COP5B
	JRST COP5B		;RET +2 OBSERVED 12/18/70 ←←←←←←
COP5A:		;DEST WASN'T OPEN (NORMAL CASE), OPEN IT
	TLZ Z,F3		;SAY JUST OPENED (HENCE PAGE COPY OK)
	MOVEI B,1B20		;"WRITE" BIT FOR OPENF
	TLNE Z,F2		;SKIP IF "COPY" NOT "APPEND"
	MOVEI B,1B22		;"APPEND" BIT FOR OPENF
	LDB A,[POINT 6,E,29]		;GET WRITE MODE FROM E
	DPB A,[POINT 4,B,9]
	LDB A,[POINT 6,E,35]		;BYTE SIZE
	DPB A,[POINT 6,B,5]
	HRRZ A,OUTDSG		;JFN
	CALL $OPENF
COP5B:	MOVE AA,E		;SAVE MODE AND BYTE SIZE (NEEDED IF ANOTHER
		;COPY TO SAME FILE OCCURS IN GROUP)
;HAVE ESTABLISHED MODE-BYTESIZE AND OPENED FILES.
;NOW DECIDE WHETHER A COPY WITH DISK SOURCE IS TO BE DONE BY BYTES
;OR PAGES (SET F1 FOR PAGES), BECAUSE BYTES CASE REQUIRES SPECIAL
;CHECKS BELOW.
	TLZ Z,F1		;SAY BYTES FOR NOW
	JUMPN C,COP6Z		;NON-DISC SOURCE, NO SPECIAL CHECK
	TLNN Z,F2+F3		;"APPEND" COMMAND AND OUTFILE ALREADY OPEN
		;(GROUP CASE) CAUSE BYTE COPYING
	JUMPE D,[		;NON-DISK DEST ALWAYS REQUIRES BYTE COPY.
		;BUT IF HERE, DEST IS ALSO DISK, CAN COPY BY
		;PAGES.
		TRNN Z,177777	;DON'T CPY BY PAGES IF MODES SPECIFIED
		TLO Z,F1		;SAY COPY BY PAGES
		JRST COP6Z]		;SKIP SPECIAL CHECK
;COP6C COP6Z

;COPY/APPEND...
;SPECIAL WARNING CHECKS FOR COPYING/APPENDING FROM DSK BY BYTES.
;(OTHER CASES BRANCHED AROUND THIS CODE ABOVE.)
;CHECK FOR HOLES NOT BEYOND EOF AND ANY PAGES BEYOND EOF IN SOURCE FILE
; AND TYPE WARNING MESSAGES IF FOUND.
	PUSH P,C
	PUSH P,D
		;GET PAGE # OF LAST DATA BYTE INTO B
	HRRZ A,@INIFH1
	SIZEF		;BYTE # OF EOF INTO B
	 CALL JERR
	SUBI B,1		;CONVERT BYTE # OF EOF TO BYTE # LAST DATA BYTE
	JUMPL B,COP6C		;IF IT WAS 0, ITS NOW -1, WHICH IS PAGE #.
	MOVEI C,↑D36
	IDIV C,F		;36 / BYTESIZE = # BYTES PER WORD
	IDIV B,C		;BYTE # / THAT   MAKES IT WORD #
	IDIVI B,1000		;MAKE IT PAGE # OF LAST DATA BYTE
COP6C:		;TEST FOR FIRST FREE PAGE NOT BEING AFTER LAST DATA BYTE'S PAGE
	HRRZ A,@INIFH1
	FFFFP		;FIND FIRST FREE FILE PAGE
	CAMN A,[-1]
	JRST .+3		;NO FREE PAGES IN FILE
	CAIL B,(A)
	TYPE < [Holes in file]
>
		;CHECK FOR USED PAGES AFTER LAST DATA BYTE PAGE
	HRL A,@INIFH1
	HRR A,B		;LAST DATA BYTE'S PAGE
	CALL $FNUFP		;INCREMENT A AND FIND NEXT USED PAGE
	JUMPE A,.+2		;0 RETURNED MEANS NO USED PAGE
	TYPE < [Pages after EOF will not be copied]
>
	POP P,D
	POP P,C
COP6Z:
;COP7A

;COPY/APPEND...
;IF WE WISH TO CONFIRM EACH COPY IN GROUP, HERE IS WHERE TO DO IT.

;NOW, AT LAST, WE ARE READY TO COPY. WELL, ALMOST.
;THERE ARE 5 CASES: 
; DISK TO DISK,
;	DONE BY PAGES, REPRODUCING "HOLES" AND PAGES AFTER BYTE EOF
; TTY TO ANYTHING, TERMINATED BY ↑Z
; DISK TO OTHER DEVICE OR DISK-DISK FOR APPEND OR OUTFILE ALREADY OPEN,
;	PAGE READ AND BYTE WRITE.
; OTHER DEVICE TO DISK, USUALLY BYTE READ AND PAGE WRITE.
; ANY OTHER COMBINATION, DONE ENTIRELY BY BYTES.

		;COMPUTE NEGATIVE NUMBER OF BYTES PER PAGE INTO BB
		;(DONE NOW CAUSE CAN CLOBBER CC)
	MOVEI BB,↑D36		;# BITS PER WORD
	LDB CC,[POINT 6,E,35]		;# BITS PER BYTE
	IDIV BB,CC		;FORM # BYTES PER WORD
	IMUL BB,[-1000]		;FORM - # BYTES PER PAGE
		;GET DISK SOURCE BYTE EOF IN CC
	HRRZ A,@INIFH1
	JUMPN C,COP7A
	PUSH P,C
	PUSH P,D
	SIZEF		;GETS BYTE # OF EOF IN FILE'S BYTESIZE INTO B
	 CALL JERR
		;TRANSLATE FROM BYTE SIZE OF FILE TO BYTE SIZE OF COPY.
		;NEW PTR = (OLD PTR*(36/NEW BYTE SIZE))/(36/OLD BYTE SIZE)
		; WITH ALL DIVISIONS INTEGER AND OUTERMOST ONE ROUNDED UP
	MOVEI C,↑D36
	IDIV C,F		;F: SOURCE FILE (OLD) BYTE SIZE
	MOVE CC,C
	MOVEI C,↑D36
	LDB D,[POINT 6,E,35]		;COPY (NEW) BYTE SIZE
	IDIV C,D
	MUL B,C
	DIV B,CC
	JUMPE C,.+2		;REMAINDER 0 ?
	ADDI B,1		;NO, ROUND UP.
	MOVE CC,B		;BYTE # OF EOF IN COPY BYTE SIZE
	POP P,D
	POP P,C
COP7A:
	TLNE Z,F1		;COPY BY PAGES FLAG ON?
	JRST PAGES		;YES, GO COPY BY PAGES
;COPTTY COPTT1 CTTEOF

;COPY/APPEND...  DISPATCHING TO VARIOUS EXECUTION CASES...
;COPY BY BYTES OR A COMBINATION OF BYTES AND PAGES.
		;HRRZ A,@INIFH1	;ONE JFN IN A
	HRRZ F,OUTDSG		;OTHER ALWAYS IN F
		;GENERATE POINTER TO BUFFER W PROPER BYTE SIZE IN G
	MOVE G,[440000,,BUF1]		;P FIELD AND ADDRESS
	DPB E,[POINT 6,G,11]		;BYTE SIZE = S FIELD
		;NOW DISPATCH TO THE VARIOUS CASES
	CAIN C,12		;SOURCE TTY: ?
	JRST COPTTY		;YES, SPECIAL CODE TO END ON ↑Z.
	JUMPE C,CPGBYT		;JUMP IF SOURCE DISK
	JUMPE D,[		;JUMP IF DEST DISK
		TLNE Z,F2+F3	;PG OUTPUT OK IF NOT "APPEND" AND
		JRST .+1	;OUTFILE WASN'T ALREADY OPEN (GROUP)
		JRST CBYTPG]		;USE PAGES TO WRITE ON DISK
	JRST COPBY		;ALL OTHER CASES

;COPY BY BYTES WITH TELETYPE SOURCE
;DO BYTE BY BYTE, WATCHING FOR ↑Z TERMINATOR

COPTTY:	MOVEI B,CTTEOF		;WHERE TO GO ON EOF PSI
	MOVEM B,EOFDSP		;(DON'T THINK IT CAN OCCUR 11/20/70)
COPTT1:	BIN
	CAIN B,CTRLZ
CTTEOF:	JRST [	PRINT EOL		;IN CASE SOURCE IS CONTROLLING TTY
		JRST CBYEF1]		;GO DELETE EXTRA PAGES IF DEST IS DSK
	EXCH A,F
	BOUT
	EXCH A,F
	JRST COPTT1
;COPBY COPB1 CBYEOF CBYEF1 CBYEF2

;COPY/APPEND...
;COPY/APPEND BY BYTES, NON-TTY-SOURCE CASE
;USE FULL PAGE SINS AND SOUTS FOR SPEED.

COPBY:	MOVEI B,CBYEOF
	MOVEM B,EOFDSP		;WHERE TO GO ON EOF PSI
COPB1:	MOVE B,G		;BYTE PTR
	MOVE C,BB		;BYTE COUNT, NEG FOR NO SPECIAL TERM CHARACTER
	SIN		;INPUT A STRING (JFN ALL SET IN A)
		;SIN CAUSES EOF PSI AFTER READING WHATEVER CHARACTERS
		;THERE ARE IF NOT A WHOLE "COUNT"'S WORTH LEFT IN FILE
	EXCH A,F		;GET DESTINATION JFN, SAVE SOURCE JFN
	MOVE B,G		;BYTE PTR AGAIN
	MOVE C,BB		;SAME COUNT
	SOUT		;OUTPUT STRING
	EXCH A,F		;BACK TO SOURCE JFN
	JRST COPB1		;LOOP TILL EOF PSI

;EOF PSI WHILE COPYING BY BYTES (NON-TTY CASE)
;OUTPUT PARTIAL STRING INPUT BEFORE EOF OCCURRED
; (NOTE THAT C IS UPDATED TO REFLECT THOSE BYTES WHICH WERE READ)

CBYEOF:	EXCH A,F		;GET DEST JFN
	MOVE B,G		;THAT GOOD OLD BYTE PTR
	SUBM BB,C		;CREATE COUNT IN C OF CHARS THAT WERE INPUT
	JUMPE C,.+2		;0 COUNT, NO SOUT!
	SOUT		;OUTPUT THE LAST PART
;IF DESTINATION WAS DISK, DELETE ANY ADDITIONAL PAGES
; (CLOSF DOES NOT DO THIS, BUT WILL LATER ZERO REST OF LAST PAGE).
;TTY CASE JOINS HERE.

CBYEF1:	HRRZ A,OUTDSG
	DVCHR
	LDB A,[POINT 9,B,17]		;DEVICE TYPE 0 IS DSK
	JUMPN A,COPEOF		;IF NOT DISK, DONE HERE
	LDB D,[POINT 6,E,35]		;GET BYTE SIZE USED IN COPYING
	HRRZ A,OUTDSG
	RFPTR		;GETS BYTE # OF LAST DATA BYTE IN B
	 CALL JERR
	MOVEI C,↑D36
	IDIV C,D		;36/BYTESIZE = # BYTES PER WORD
	IDIV B,C		;BYTE # /THAT = WORD # OF LAST DATA BYTE
	IDIVI B,1000		;MAKE IT PAGE #
	HRR A,B
	HRL A,OUTDSG
CBYEF2:	CALL $FNUFP		;FIND A PAGE
	JUMPE A,COPEOF		;NO MORE PAGES IN FILE, DONE
	MOVE B,A
	SETO A,
	HRLZI C,1
	PMAP		;DELETE THE PAGE
	MOVE A,B
	JRST CBYEF2
;CPGBYT CPGBY2 CPGBY3 CPGBY4 CPBEOF

;COPY/APPEND...
;COPY FROM DISK, READING BY PAGES AND WRITING BY BYTES.
;TRANSFERS ZEROS FOR HOLES OR BEYOND BYTE EOF.
;ADDED TO SPEED UP DISK TO LPT COPY.
;AT ENTRY: A,F: JFNS
;	G: BYTE PTR TO BUFFER PAGE
;	BB: - # BYTES / PAGE
;	CC: BYTE # OF EOF
;ALSO:	A: SOURCE JFN,,PAGE #

CPGBYT:	HRLZ A,@INIFH1
CPGBY2:	RPACS
	TLNN 2,(1B5)		;PAGE EXISTS?
	JRST .+4		;NO, DON'T MAP IT
	MOVE B,[B0,,<BUF1>B44]
	HRLZI C,B2+1
	PMAP		;MAP IN THE PAGE
;HAVE A PAGE IN SOURCE FILE, DECIDE WHAT TO DO WITH IT BY
;COMPARING PAGE # AND FILE'S BYTE EOF
	HRRZ C,A		;PAGE #
	IMUL C,BB		; - BYTE # OF FIRST BYTE IN PAGE
	ADD C,CC		;CC: BYTE # OF EOF
	MOVN C,C		;FORM - # BYTES IN OR BEYOND THIS PAGE
	JUMPGE C,CPBEOF		;NONE, DONE.
;TRANSFER PARTIAL PAGE IF THIS IS EOF PAGE, ELSE WHOLE PAGE.
	CAMGE C,BB		;- # BYTES/PAGE
	MOVE C,BB		;MAXIMUM TRANSFER
	RPACS
	TLNN 2,(1B5)		;PAGE EXISTS?
	JRST CPGBY4		;NO, USE ZEROS
;OUTPUT # BYTES IN C
	EXCH A,F		;GET DEST JFN
	MOVE B,G		;STRING PTR TO BUFFER
	SOUT		;STRING OUTPUT
CPGBY3:	EXCH A,F
	AOJA A,CPGBY2		;DO NEXT PAGE

CPGBY4:	EXCH A,F
	SETZ 2,
	BOUT			;DO PAGE WORTH OF ZEROS
	AOJL C,.-1
	JRST CPGBY3

;COPY BY PAGES-BYTES EOF. CLEAR BUFFER.

CPBEOF:	SETO A,
	MOVE B,[B0,,<BUF1>B44]
	HRLZI C,1
	PMAP
	JRST COPEOF
;CBYTPG CBYPG2 CBPGEF CBPEF3

;COPY/APPEND...
;COPY NON-DISK TO DISK IN NON-APPEND, NON MULTIPLE SOURCE CASE.
;USES BYTES FOR INPUT, PAGES FOR OUTPUT.
;ADDL ACS: F: DEST JFN,,PAGE #
;	CC: # BYTES TRANSFERRED+1, USED TO SET DEST EOF PTR.

CBYTPG:	HRLZ F,OUTDSG
	MOVEI B,CBPGEF
	MOVEM B,EOFDSP		;WHERE TO GO ON EOF
	SETZ CC,
CBYPG2:	SETO A,		;CLEAR BUFFER AT TOP OF LOOP TO MAKE SURE
	MOVE B,[B0,,<BUF1>B44]		;...OF EOF PAGE IS 0
	HRLZI C,1
	PMAP
	HRRZ A,@INIFH1
	MOVE B,G
	MOVE C,BB		;NEG # BYTES/PAGE
	SUB CC,C		;COUNT BYTES TRANSFERRED
	SIN		;READ A PAGE'S WORTH OF BYTES
	MOVE B,F
	MOVE A,[B0,,<BUF1>B44]
	HRLZI C,B3+1
	PMAP		;MAP OUT THE PAGE
	AOJA F,CBYPG2		;NEXT PAGE AND LOOP

;BYTES-PAGES END OF FILE

CBPGEF:	ADD CC,C		;ADJUST FOR UNUSED PART OF BYTE COUNT
	CAMN C,BB		;WHOLE PAGE UNUSED?
	SKIPA A,[-1]		;YES, PUT NO PAGE IN DESTINATION
	MOVE A,[B0,,<BUF1>B44]
CBPEF3:	MOVE B,F
	HRLZI C,B3+1
	PMAP		;MAP OUT LAST PAGE OR DELETE PAGE
;FAKE THINGS UP AND ENTER PAGES-PAGES ROUTINE TO DELETE RESET OF DEST
;AND SET EOF AND BYTE SIZE
	SETZ D,		;SAYS NO MORE SOURCE "PAGES"
	JRST PAGE5A
;PAGES PAGES3 PAGES4

;COPY/APPEND...
;COPY DISK TO DISK BY PAGES
;NOTE THAT BYTE SIZE IN E MUST BE PRESERVED

PAGES:	HRLZ D,@INIFH1		;D: SOURCE JFN,,PAGE #
	HRLZ F,OUTDSG		;F: DEST JFN,,PAGE #
		;D AND F ARE SET TO 0 AFTER ALL PAGES IN FILE ARE USED
;GET FIRST PAGE IN EACH FILE
	MOVE A,D
	CALL $FFUFP
	MOVE D,A
	MOVE A,F
	CALL $FFUFP
	MOVE F,A
;HAVE A PAGE IN EACH FILE. DECIDE WHAT TO DO WITH THEM.

PAGES3:	JUMPE F,[;NO MORE PAGES IN DEST
		JUMPE D,PAGES9		;ALSO NO MORE IN SOURCE, DONE.
		JRST PAGES5]		;GO COPY PAGE
	JUMPE D,PAGES4		;NO MORE PAGES IN SOURCE, DELETE REST OF DEST
	MOVEI A,(D)
	CAIG A,(F)		;COMPARE SOURCE PAGE # TO DEST PAGE #
	JRST PAGES5
;DELETE DEST PAGES CORRESPONDING TO "HOLE" IN SOURCE

PAGES4:	SETO A,
	MOVE B,F
	HRLZI C,1		;PMAP DISPOSAL INFO
	PMAP
	MOVE A,F
	CALL $FNUFP		;NEXT PAGE IN DEST
	MOVE F,A
	JRST PAGES3		;GO DECIDE AGAIN
;PAGES5 PAGE5A PAGES6

;COPY/APPEND...
;COPY BY PAGES...
;COPY A PAGE

PAGES5:	MOVE A,D		;SOURCE JFN AND PAGE NUMBER
	MOVE B,[B0,,<BUF1>B44]
	HRLZI C,B2+1
	PMAP		;MAP SOURCE PAGE INTO BUFFER
	HRL A,OUTDSG		;DON'T USE F HERE, MAY BE 0!
	HRRI B,<BUF2>B44
	HRLZI C,B3+1
	PMAP		;MAP DESTINATION PAGE INTO ANOTHER BUFFER
	MOVE A,[BUF1,,BUF2]
	BLT A,BUF2+777		;COPY DATA
	MOVEI A,(D)		;MASK PAGE # OF PAGE JUST COPIED
	CAIGE A,(F)		;COMPARE TO DEST PAGE #
	JRST PAGES6		;PAGE WAS COPIED INTO A HOLE IN DEST
;COPY BY BYTES-PAGES COMES HERE AFTER EOF WITH D 0 AND BB,CC,F CORRECT
; TO DELETE REST OF DEST FILE AND SET ITS PTR AND BYTE SIZE.

PAGE5A:	MOVE A,F
	CALL $FNUFP		;NEXT PAGE IN DEST
	MOVE F,A
PAGES6:	MOVE A,D
	CALL $FNUFP		;ALWAYS NEXT PAGE IN SOURCE
	MOVE D,A
	JRST PAGES3
;PAGES9 COPEOF

;COPY/APPEND...
;FINISH UP COPY BY PAGES.
;ALSO USED FOR BYTES-PAGES, SO NOTHING DISK-DEPENDENT CAN BE DONE HERE.

PAGES9:	SETO A,		;CLEAR BUFFERS
	MOVE B,[B0,,<BUF1>B44]
	HRLZI C,1
	PMAP
	HRRI B,<BUF2>B44
	PMAP
;SET END POINTER OF DESTINATION FILE
	MOVE B,CC		;BYTE COUNT OF SOURCE EOF
	HRRZ A,OUTDSG		;SET POINTER FOR THIS OPENING OF FILE, IN CASE
	SFPTR		;SEQUENTIAL I/O FOLLOWS (GROUP SOURCE CASE)
	 CALL JERR
	HRLI A,FDBSIZ		;SET EOF PTR IN FILE (CLOSF DOES NOT WHEN
	MOVE C,B		;NO SEQUENTIAL OUTPUT HAS BEEN DONE)
	SETO B,
	CHFDB		;CHANGE FILE DESCRIPTOR BLOCK
;SET BYTE SIZE OF DESTINATION FILE
;(CLOSF DOES NOT SET IT WHEN NO SEQUENTIAL OUTPUT HAS BEEN DONE)
		;MOVE A,OUTDSG
	HRLI A,FDBBYV
	SETZ C,
	DPB E,[POINT 6,C,11]		;BYTE SIZE STILL IN E
	MOVSI B,(77B11)			;BITS TO CHANGE
	CHFDB

;COPY OR APPEND COMPLETE.
;PAGE-COPY FALLS IN, ALL OTHER CASES BRANCH HERE.

COPEOF:	SETZM EOFDSP		;(REDUNDANT EXCEPT IN ↑Z ON TTY CASE)
	CALL GNFIL		;GET NEXT FILE IN INPUT GROUP
	JRST [	CALL RLJFNS		;NO MORE FILES, RELEASE JFNS
		JRST CMDIN4]		;GO BACK TO COMMAND INPUT LOOP
	JRST COPFL
;$FNUFP $FFUFP

;COPY/APPEND...
;SUBROUTINE TO GET NEXT USED PAGE # OF DISK FILE.
;TAKES IN A:  JFN,,CURRENT PAGE #.  RETURNS A 0 IF NO MORE PAGES.
;MUST BE NEAR COPY TO MINIMIZE PAGE FAULTS

$FNUFP:	JUMPE A,[RET]		;ALREADY AT END, NOP.
	ADDI A,1		;NEXT PAGE NUMBER
	TRNN A,-1
	JRST [	SETZ A,		;WRAP-AROUND FROM MAX PAGE NUMBER
		RET]
;ENTRY TO GET FIRST USED PAGE NUMBER. DOESN'T INCREMENT FIRST.

$FFUFP:	FFUFP
	 CALL [	CAIE A,FFUFX3		;"NO MORE PAGES" ERROR?
		JRST JERR
		SETZ A,
		RET]
	RET
;$COPY .ASCII ASCII1 $ASCII .BINAR .BYTE .IMAGE $IMAGE .RECOR

;COPY/APPEND SUBCOMMAND TABLE AND ROUTINES

$COPY:	TABLE
	TE ASCII
	TE BCD,ONEWD+INVIS,NIYE
	TE BINARY,ONEWD
	T BYTE,LPROK+INVIS
	TE DUMP,ONEWD+INVIS,NIYE
	TE IMAGE
	T RECORD,LPROK+INVIS
	TEND

.ASCII:	KEYWD $ASCII
	 TE ,,2
	 JRST CERR
ASCII1:	CONFIRM
	TRNE KWV,B0
     TYPE < [ASCII parity not implemented yet, will treat as ASCII]
>
	HRR Z,KWV		;NEW FLAGS FROM TABLE ENTRY
	RET

$ASCII:		TABLE
		TE PARITY,,B0+2		;B0: PARITY CHECK. 2: ASCII MODE
		TEND

.BINAR:	HRRI Z,10000		;"BINARY" MODE BIT (MODE 14)
	RET

.BYTE:	NOISE (size)
	CALL DECIN
	JRST CERR
	CONFIRM
	MOVEI E,0(A)		;BYTE SIZE GOES IN E WITH MODES 0
	TRO Z,1			;SAY MODE 0
	RET

.IMAGE:	KEYWD $IMAGE
	 TE ,,400
	 JRST CERR
	JRST ASCII1

$IMAGE:		TABLE
		TE BINARY,,4000
		TEND

.RECOR:	NOISE (length)
	JRST NIYE
;$OPEN7 $OPENF $OPNER

;OPEN FILE SUBROUTINE
;DOES OPENF, RETURNS ON SUCCESS, GIVES MESSAGE ON FAILURE
;CALL WITH A & B SET UP FOR "OPENF" JSYS.
;CHECKS FOR AND DOES NOT RE-OPEN PRI I/O FILES
; (PRI FILES ARE SOMETIMES DEFAULT ARG VALUES).

$OPEN7:	HRLI B,<7B5+0B9>B53	;ENTER HERE FOR 7 BIT BYTES NORMAL MODE
$OPENF:	CAME A,CIJFN		;REGULAR ENTRY
	CAMN A,COJFN
	RET			;DON'T TRY TO OPEN PRI FILES AGAIN
	PUSH P,A		;SAVE JFN FOR USE IN ERROR MESSAGE
	OPENF			;OPEN FILE
	 CALL $OPNER		;ERROR, # IN A, SAVE PC FOR JERR.
	POP P,A			;SUCCESS, RETURN TO CALLER.
	RET

$OPNER:	MOVE C,-1(P)		;RETRIEVE JFN FOR %S
	CAIN A,OPNX13
	 ERROR <Access to %3S denied>
	CAIN A,OPNX3
	ERROR <Read protect violation for file %3S>
	CAIN A,OPNX4
	ERROR <Write protect violation for file %3S>
	CAIN A,OPNX6
	ERROR <%3S can't be appended to>
	CAIN A,OPNX7
	JRST [	MOVE A,C
		DVCHR
		HLRZ C,C
		UERR [ASCIZ /%1H: is assigned to job %3Q/]]
	CAIN A,OPNX8
	ERROR <%3H: not mounted>
	CAIN A,OPNX9
	 JRST [	TRNN B,1B18!1B20!1B21!1B22!1B23!1B24	;READ ONLY OPENF
		TROE B,1B25		;HAVING ALREADY TRIED THAWED?
		 ERROR <file %3S busy>	;ANNOUNCE ERROR
		SUB P,[1,,1]		;FLUSH ERROR PC
		POP P,A			;RETREIVE JFN
		JRST $OPENF]		;AND TRIED IN THAWED MODE
	CAIN A,OPNX10
	ERROR <No room in system for another open file>
	JRST JERR		;GO TO GENERAL JSYS ERROR ROUTINE
;LIST/TYPE <FILE GROUP DESCRIPTOR>

;FLAGS USED, IN AC F
;B0  "PRINTER WATCH ON"
;B1  SITE INCLUDED IN HEADING
;B2  INDICATE NULLS BY ↑@
;B3  NO PAGE NUMBERS
;B4  SUPPRESS PRINTING/CHARACTER POSITION ACCOUNTING (SKIPPING PAGES)
;B5  LAST LINE SCANNED WAS COMMENT
;B6  LAST LINE SCANNED WAS NOT COMMENT
;B7  LAST CHAR LF OR EOL AND SPACING GREATER THAN 1
;B8  LAST CHAR WAS LINE OVERFLOW EOL
;B9  LAST CHAR WAS CONTROL CHAR TO INDICATE WITH ↑X (LOCAL TO GETC)
;B10 SUPPRESS PRINTING (WHEN PASSING EOLS & ↑LS AT BOTTOM OF PAGE)
;B11 EOF HAS BEEN ENCOUNTERED IN INPUTTING TO INPUT BUFFER
;B12 EOF HAS BEEN ENCOUNTERED IN READING FROM INPUT BUFFER
;B13 LAST CHR WAS EOL, OUTPUT AN LF THIS TIME
;B14 PAUSE BEFORE EACH PAGE
;B15 SOURCE IS TTY, TERMINATE ON ↑Z
;B16 DETACH BEFORE LISTING
;B17 LOGOUT AFTER LISTING
;B18 VERBATIM FILE OUTPUT, NO CONTROL CHARACTER INDICATION
;B19 SET WHEN ANY DATA IS REALLY WRITTEN INTO THE OUTPUT FILE
;LIST/TYPE...   STORAGE

;IN XPRIV.MAC:
;GHEAD		0 OR BYTE POINTER TLSUBCOMMAND-GIVEN HEADING
;HEAD		0 OR PTR TO HEAD BEING USED FOR THIS FILE, INCL "PAGE "
;HEDLNO		# LINES IN HEADING, INCL EOLS BEFORE AND AFTER
;SPCG		0 FOR SINGLE SPACING, 1 FOR DOUBLE, ETC
;WIDTH		PAGE WIDTH IN COLUMNS
;LENGTH		PAGE LENGTH IN LINES
		; = LAST LINE AT WHICH TO BREAK PAGE IF NO ↑L
;L35		FIRST LINE AT WHICH TO BREAK PAGE IN ABSENCE OF ↑L
;L50		PREFERRED LINE AT WHICH TO BREAK PAGE
;PAGENO		PAGE NUMBER, INCREMENTED AT ↑L
;PAGEN1		SUBPAGE NUMBER, INCREMENTED WHEN OVERLONG PAGE IS SPLIT
;BESPTR		POINTER TO BEST PLACE IN OUTBUF YET SEEN TO BREAK PAGE
;BESCOR		"SCORE" ASSOCIATED WITH BESPTR
;BESLNO		LINE # AT BESPTR
;PPRINT		POINTER TO BLOCK OF WORDS SPECIFYING PAGES TO LIST,
		;EACH WORD BEING MIN,,MAX, 0 TERMINATING BLOCK.

;THE PAGE BUF1 (DEFINED IN XDEF.MAC) IS INPUT BUFFER
INBUF==BUF1
INBUFL==<BUF1+1000-INBUF>*5-1		;LENGTH, LEAVING SPACE FOR NULL

;OUTPUT BUFFER IS BUF2 AND FOLLOWING PAGES

;AC'S
;CHR (DEFINED IN XDEF)		;CHARACTER READ FROM INBUF
;CNO AND LNO SPECIFY POSITION ON PAGE OF LAST CHARACTER IN OUTBUF
CNO==BB		;COLUMN NUMBER ON LINE
LNO==CC		;LINE NUMBER ON PAGE
INPTR==DD		;BYTE PTR TO INPUT BUFFER
OUTPTR==EE		;BYTE PTR TO OUTPUT BUFFER
;CNT (DEFINED IN XDEF)		;NUMBER OF CHARACTERS REMAINING IN INBUF

GBGPCT==↑D20	;PERCENT CONTROL CHRS IN FIRST PAGE OF FILE ABOVE WHICH
		; THE FILE IS CONSIDERED TO BE GARBAGE
;.TYPE .LIST LIST1 LIST01

;LIST/TYPE

.TYPE:	MOVE A,['E TYPE']
	SETNM
	MOVE A,COJFN
	MOVEM A,OUTDSG
	JRST LIST1

.LIST:	MOVE A,['E LIST']
	SETNM
	CALL $LPT		;USE A "DIRECTORY" SUBCOMMAND ROUTINE TO
		;ASSIGN A JFN TO LINE PRINTER
	MOVEI A,↑D132
	MOVEM A,WIDTH
	JRST LIST01

LIST1:	SETOM WIDTH		;INDICATE WIDTH UNSPECIFIED
LIST01:	NOISE (file)
	SETZ F,		;CLEAR FLAGS
	SETZM GHEAD
	SETZM SPCG
	SETOM LENGTH		;INDICATE LENGTH UNSPECIFIED
	MOVEI A,[1,,777777
		0]
	MOVEM A,PPRINT
	CALL $INFG		;INPUT FILE GROUP
	JRST [		;R1: SUBCOMMANDS REQUIRED
		CONFIRM
		SUBCOM $LIST
		JRST .+2]
	CONFIRM
;LIST1D

;LIST/TYPE...   PRE-FIRST-FILE INITIALIZATION

;OPEN OUTPUT FILE
	MOVE A,OUTDSG
	MOVEI B,1B20
	CALL $OPEN7
;NOW THAT "[LPT: BUSY-GO]" HAS BEEN PRINTED,
;DETACH IF REQUESTED BY SUBCOMMAND
	TLNN F,B16
	JRST LIST1D
	ETYPE < Detaching job %J
>;
	DTACH
LIST1D:
;USE ACTUAL LENGTH AND WIDTH OF OUTPUT DEVICE IF NOT SPECIFIED
; BY USER WITH "LENGTH" AND "WIDTH" SUBCOMMANDS
	MOVE A,OUTDSG
	RFMOD
	LDB A,[POINT 7,B,17]	;GET WIDTH
	CAIGE A,↑D15		;REASONABLE (LESS SCREWS TITLE SETUP)
	MOVEI A,377777		;NO. 0 MEANS INFINITY (NO FOLDING)
	SKIPGE WIDTH		;SKIP IF SPECIFIED BY SUBCOMMAND
	MOVEM A,WIDTH		;STORE DEVICE WIDTH
	LDB A,[POINT 7,B,10]	;GET OUTPUT DEVICE PAGE LENGTH
	CAIGE A,↑D10		;REASONABLE?
	MOVEI A,↑D66		;NO, USE COMMON DEFAULT
	IMULI A,↑D10		;LEAVE 1/11 PAGE LENGTH FOR MARGINS
	IDIVI A,↑D11
	SKIPGE LENGTH		;SKIP IF SPECIFIED BY SUBCOMMAND
	MOVEM A,LENGTH		;STORE PAGE LENGTH

;DETERMINE LINE "35"=FIRST LINE AT WHICH PAGE BREAK CAN OCCUR
	MOVE B,LENGTH		;PAGE LENGTH, PERHAPS CHANGED FROM 60
	IMULI B,↑D8		;...BY SUBCOMMAND
	IDIVI B,↑D12
	MOVEM B,L35
;DETERMINE LINE "50"=OPTIMUM PAGE BREAK POINT (NOW ACTUALLY 55)
	MOVE B,LENGTH
	IMULI B,↑D11
	IDIVI B,↑D12
	MOVEM B,L50
	JRST LSTFL		;JUMP AROUND SUBCMD STUFF
;$LIST ..DETA ..DOUB


;LIST/TYPE SUBCOMMAND TABLE AND ROUTINES

$LIST:		TABLE
		TE DETACH,LPROK+INVIS,..DETA
		T DOUBLESPACE,ONEWD+INVIS,..DOUB
		TE HEADING
		T INDICATE,LPROK+EOLOK+ALTCON,..INDI
		T LENGTH,,..LENG
		TE LOGOUT,LPROK+INVIS,...LOG
		TE NO,LPROK,...NO
		T OUTPUT,CONMAN+LPROK,..OUTP
		T PAGES
		TE PAUSE,LPROK
		TE SITE,LPROK,..SITE
		T SPACING
		T VERBATIM,ONEWD,...VRB
;		TE WATCH,,..WATC
		T WIDTH
		TEND

..DETA:	NOISE (before listing)
	CONFIRM
	TLO F,B16
	RET

..DOUB:	MOVEI A,1
	JRST SPAC2
;.HEADI HEADI1

;LIST/TYPE SUBCOMMANDS...

;HEADING: TAKE TEXT TO CR OR ALT MODE, COMMENT OK AFTER ALT MODE,
;CR TERMINATING "HEADING" MEANS NONE.
;CARRIAGE RETURNS CAN BE PUT IN HEADING WITH ↑V OR &.

.HEADI:	MOVE A,[POINT 7,[0]]
	TRNE CBT,TEOL
	JRST [	CONFIRM
		JRST HEADI1]
	CALL CSTR
	CAIN TRM,FORMF
	JRST .+5
	CAIE CHR,EOL
	CAIN CHR,ALTM
	JRST .+2
	JRST MORE
	ALTYPE ( )
	CONFIRM
		;COPY TEXT TO CSBUF: CAN'T USE "BUFFF" CAUSE IT CHANGES CONTCH
		;TO SPACE, LOWER CASE TO UPPER, HAS LENGTH LIMIT.
	MOVE A,CSBUFP
	MOVE B,.BFP
	MOVE C,CNT
	SOJLE C,.+3
	ILDB D,B
	IDPB D,A
	SOJG C,.-2
	SETZ C,
	IDPB C,A
	EXCH A,CSBUFP
HEADI1:	MOVEM A,GHEAD
	RET
;..INDI ..LENG ...LOG ...NO ..OUTP

;LIST/TYPE SUBCOMMANDS...

..INDI:	UNOI [ASCIZ /nulls by ↑@/]
	ALLOW  TSPC+TALT+TEOL
	CONFIRM
	TLO F,B2
	RET

..LENG:	NOISE (of page is)
	CALL DECIN
	 JRST CERR
	ALLOW TALT+TSPC+TEOL
	CAIG A,↑D10
	JRST CERR
	CONFIRM
	MOVEM A,LENGTH
	RET

...LOG:	NOISE (after listing)
	CALL INFER
	JRST .+2
	ERROR <Not legal in inferior EXEC>
	CONFIRM
	TLO F,B17
	RET

...NO:	NOISE (page numbers)
	CONFIRM
	TLO F,B3
	RET

..OUTP:	NOISE (to file)
	MOVE A,[2,,[ASCIZ /LST/]]		;DEFAULT: SOURCE NAME, .LST
	CALL COUTFN
	 JRST CERR
	ALLOW TALT+TSPC+TEOL
	CONFIRM
	MOVEM A,OUTDSG
	RET
;.PAGES PAGE1 PAGE2

;LIST/TYPE SUBCOMMANDS...

;PAGES N,N-N,N-N,N...
;EACH NUMBER MUST BE GREATER THAN OR EQUAL TO LAST

.PAGES:	MOVEI D,1		;LARGEST NUMBER YET SEEN
	AOS B,CSBUFP		;BUILD BLOCK OF MIN,,MAX IN STRING BUFFER
PAGE1:	TLO Z,DASHF		;MAKES "-" A FIELD TERMINATOR
	CALL DECIN
	 JRST CERR
	CAIL A,(D)
	CAILE A,-1
	JRST CERR
	HRL C,A
	MOVE D,A
	CAIE TRM,"-"
	JRST PAGE2
	CALL DECIN
	 JRST CERR
	CAIL A,(D)
	CAILE A,-1
	JRST CERR
	MOVE D,A
PAGE2:	HRR C,A
	MOVEM C,(B)
	TRNE CBT,TCOM
	AOJA B,PAGE1
	ALLOW TALT+TSPC+TEOL
	TLZ Z,DASHF
	ALLOW TALT+TSPC+TEOL
	CONFIRM
	SETZM 1(B)		;0 ENDS BLOCK
	ADDI B,2
	EXCH B,CSBUFP
	HRRZM B,PPRINT
	RET
;.PAUSE .SPACI SPAC2 ..SITE ...VRB .WIDTH

;LIST/TYPE SUBCOMMANDS...

.PAUSE:	NOISE (before each page)
	CONFIRM
	TLO F,B14
	RET

.SPACI:	CALL DECIN
	 JRST CERR
	ALLOW TALT+TSPC+TEOL
	SOJL A,CERR		;STORE SPACING - 1
	CAIL A,10
	JRST CERR
SPAC2:	CONFIRM
	MOVEM A,SPCG
	RET


..SITE:	NOISE (in heading)
	CONFIRM
	TLO F,(1B1)
	RET

...VRB:	CONFIRM
	TRO F,1B18		;SUPPRESS CONTROL INDICATON
	RET

;..WATC:	NOISE (for printer completion)
;	CONFIRM
;	TLO F,(1B0)
;	RET
;

.WIDTH:	CALL DECIN
	 JRST CERR
	ALLOW TALT+TSPC+TEOL
	CAIG A,↑D15		;LESS SCREWS UP TITLE SETUP CODE
	JRST CERR
	CONFIRM
	MOVEM A,WIDTH
	RET
;LSTFL

;LIST/TYPE...
;HERE TO LIST NEXT FILE IN LIST

LSTFL:	MOVE A,OUTDSG		;OUTPUTTING TO CONTROL TTY?
	CAME A,COJFN
	TLNE F,B16		;OR DETACHING?
	CAIA			;YES, DON'T TYPE FILENAME
	 CALL TYPIF		;NO, TYPE FILENAME IF MULTIPLE
	TLZ F,B4+B5+B6+B7+B8+B9+B11+B12+B13+B15
;OPEN INPUT FILE
	HRRZ A,@INIFH1
	MOVEI B,1B19
	CALL $OPEN7
;SET ↑Z FLAG IF TTY
	DVCHR
	LDB E,[POINT 9,B,17] ;DEVICE TYPE IN E USED FOR HEADING BELOW
	CAIN E,12
	TLO F,B15
;LSTH1B

;LIST/TYPE...  SET UP HEADING
	SETZ CNO,		;WILL BE USED TO ACCOUNT SPACES AND EOLS IN HEDG
	MOVEI LNO,1		;START # LINES AT 1 TO ALLOW FOR EOL BEFORE HEDG
	SKIPE INPTR,GHEAD
	JRST LSTH2		;HAVE SUBCOMMAND-GIVEN HEADING

;SET UP DEFAULT HEADING: FILE NAME AND DATE & TIME
	MOVE A,CSBUFP
	ADDI A,40		;ADD 40 CAUSE ITS WRITTEN OVER BELOW,
	MOVE INPTR,A		;INSERTED EOLS MAY CAUSE WIDTH OVERFLOW
	CALL COMCHR		;OUTPUT THE COMMENT CHARACTER
	MOVEI B," "
	BOUT
	BOUT
	TLNE F,(1B1)		;CHECK "SITE" BIT
	 CALL SITEO		;OUTPUT SITE ON A
	HRRZ B,@INIFH1
	MOVE C,[2B2+1B5+1B8+1B11+1B14+1]
	JFNS
	HRROI B,[ASCIZ /   /]
	SETZ C,
	SOUT
		;DATE: WRITE DATE OF DISC FILE TO WHICH WE HAVE LIST ACCESS,
		;ELSE CURRENT.
	SETO B,		;SAYS "CURRENT" TO ODTIM
	JUMPN E,LSTH1B		;JUMP IF NON-DISC
		;GET WRITE DATE
	PUSH P,A
	HRRZ A,@INIFH1
	MOVE B,[1,,FDBWRT]
	MOVEI C,B
	CALL $GTFDB		;DO GTFDB JSYS, NO SKIP IF NO ACCESS
	SETO B,		;NO ACCESS, USE CURRENT
	POP P,A
LSTH1B:	HRLZI C,B1+B10+B11+B17		;ODTIM FORMAT
	ODTIM
	SETZ CNT,		;BUT TELL "GETC" ITS INFINITELY SHORT
		; (ALSO BECAUSE ITS NULL TERMINATED)
;LSTH2 LSTH2A LSTH2D

;LIST/TYPE SETTING UP HEADING...

;SCAN HEADING STRING, COUNTING EOL'S (FOR EFFECT ON PAGE SIZE) AND
;COLUMNS USED (SO PAGE NUMBER CAN BE POSITIONED AT RIGHT).
;USE FAKED-UP CALLS TO FILE CHAR READER "GETC".
;"INPTR" NOW POINTS TO STRING.

LSTH2:	TLO F,B11
	MOVE OUTPTR,CSBUFP
	MOVEM OUTPTR,HEAD
	SETZ CNT,		;TELL GETC ITS TERMINATED BY FIRST NULL
LSTH2A:	CALL GETC		;READ CHARACTER
	CAIE CHR,CONTCH		;CHANGE CONTINUATION CHARACTER & TO CRLF
	JRST LSTH2D
	MOVEI B,CR
	DPB B,OUTPTR		;OVERWRITE THE "&"
	MOVEI B,LF
	IDPB B,OUTPTR
	SETZ CNO,
	MOVEI LNO,1(LNO)
LSTH2D:	CAIE CHR,200		;END OF STRING ?
	JRST LSTH2A
;SPACE OVER AND ADD " PAGE " IF PAGES ARE TO BE NUMBERED
	MOVE A,OUTPTR
	TLNE F,B3
	JRST LSTH4		;PAGE NUMBERS SUPPRESSED
	MOVE C,WIDTH
	SUBI C,↑D14		;SPACE FOR "  PAGE NNN:NNN"
	SUB C,CNO
	CAILE C,↑D128		;WIDTH IS INFINITY?
	MOVEI C,↑D10		;YES, USE SOMETHING MORE MODEST
	JUMPLE C,[MOVEI B,CR	;ALREADY TOO FAR RIGHT, START WITH CRLF
		DPB B,A
		IBP A
		MOVEI B,LF
		MOVEI LNO,1(LNO)
		ADD C,CNO
		AOJA C,.+2]
	MOVEI B," "
	SUBI C,5		;MOVE LEFT 5 MORE COLUMNS IF POSSIBLE.
		;THIS MAKES 2-DIGIT PAGE NUMBER LINE UP NICELY
		;OVER 72-COL TEXT WHEN WIDTH IS 80
		;(NORMAL CASE TO LPT:)
	MOVEI CHR," "
	DPB B,A		;STORE FIRST CHAR OVER NULL
	IDPB CHR,A
	SOJG C,.-1
	HRROI B,[ASCIZ /Page /]
	SETZ C,
	SOUT
;LSTH4 LSTH8 LSTIGE LSTGCK LSTGCE

;LIST/TYPE...
;TERMINATE HEADING STRING AND SAVE THINGS

LSTH4:	SETZ CHR,
	IDPB CHR,A
		;DO NOT SAVE END PTR - REUSE SPACE FOR NEXT FILE
	MOVE A,HEAD
	ILDB A,A		;SEE IF HEADING NULL
	JUMPE A,[SETZM HEAD		;IF SO, SAY SO (SUPPRESSES EOLS AFTER)
		JRST LSTH8]		;DON'T ACCOUNT EOLS AFTER
	MOVEI LNO,3(LNO)		;ALLOW FOR EOL'S AFTER HEADING
	ADD LNO,SPCG
LSTH8:	MOVEM LNO,HEDLNO		;NUMBER OF LINES USED BY HEADING AND EOLS
	TLZ F,B11+B12
;REST OF PER-FILE INITIALIZATION
		;EOF PSI DISPATCH
	MOVEI A,LSTEOF
	MOVEM A,EOFDSP
		;INIT CHARACTER POSITION, PAGE #, BUFFERS, ETC
	SETZB LNO, BESLNO
	SETZB CNO,PAGEN1
	MOVEI A,1
	MOVEM A,PAGENO
	MOVE INPTR,[POINT 7,[0],-1]		;NO TEXT IN INBUF
	SETZ CNT,		;..
	MOVEM INPTR,BESPTR		;NO TEXT SAVED FROM LAST PAGE
	MOVE OUTPTR,[POINT 7,BUF1]		;JUST FOR SAFETY
;PASS EOLS AT BEGINNING OF FILE
	TLO F,B4
LSTIGE:	CALL GETC
	CAIE CHR,LF
	CAIN CHR,CR
	JRST LSTIGE
		;CAIE CHR,FF
	CAIN CHR,EOL
	JRST LSTIGE
		;200 FOR EOF REMAINS IN CHR TIL TITLE IS PRINTED

;SCAN TEXT IN FIRST BUFFERFUL AND CHECK FOR UNREASONABLE CONCENTRATION
; OF OF CONTROL CHARACTERS
	TLNN F,B15		;OMIT CHECK IF SOURCE IS TTY
	CAIG CNT,↑D200		;OMIT CHECK FOR VERY SHORT FILES
	 JRST LSTGCE
	MOVE A,INPTR		;INITIAL BYTE PTR
	MOVE C,CNT		;COUNT OF CHARS IN BUFFER
	SETZ D,			;INIT CONTROL CHAR COUNT
LSTGCK:	ILDB B,A		;GET CHAR FROM BUFFER
	CAIL B,40		;SKIP IF A CONTROL CHARACTER
	 JRST .+4		;NOT, CONTINUE
	CAIL B,10		;DON'T COUNT ↑H THRU ↑M
	CAILE B,15
	 JRST [	SKIPE 0(A)	;WHOLE WORD NULL?
		JUMPE CHR,.+1	;NO, DON'T COUNT NULL CHR
		AOJA D,.+1]	;COUNT IF WORD NULL OR CHR NON-NULL
;;;NB: THIS REALLY SHOULD NOT APPLY IF THIS CONTROL CHARACTER
;;;	WAS PRECEEDED BY A LINE PRINTER GRAPHIC QUOTE.  THIS IS
;;;	177 FOR ANELEX, AND SOME OTHERS.
	SOJG C,LSTGCK		;REPEAT FOR ALL CHARACTER IN BUFFER
	IMULI D,↑D100/GBGPCT	;CHECK FOR GT GBGPCT % CONTROL CHARAS
	CAMG D,CNT
	 JRST LSTGCE		;FILE IS OK, CONTINUE
	HRRZ A,@INIFH1		;TOO MANY, COMPLAIN
	ETYPE < [File %1S contains excessive control characters
and does not look like a text file.  Type CR to print it anyway, or
rubout to bypass it]>
	BTCHER			;THIS IS AN ERROR UNDER BATCH
	CALL TCONF		;REQUIRE CONFIRMATION FROM USER
	 JRST LIST8		;NOT CONFIRMED, BYPASS THIS FILE
LSTGCE:	CALL GETC4		;ACCOUNT FOR CHAR TO BE PRINTED
	JRST LSTTOP		;SKIP SKIPPER
;LSKIP

;LIST/TYPE...   SKIP PAGE

LSKIP:	TLO F,B4		;SUPPRESS PRINTING AND ACCOUNTING
		;IGNORE CARRY-OVER TEXT. IT CAN'T CONTAIN A SIGNIFICANT ↑L,
		;INDEED I THINK IT CAN'T BE NON-NULL.
		;SCAN TO ↑L.
	CALL GETC		;GET CHAR FROM INBUF
	CAIN CHR,200
	JRST LIST8		;EOF, DONE LISTING
	CAIE CHR,FORMF
	JRST .-4
		;SCAN PAST IMMEDIATELY FOLLOWING EOLS & ↑L'S -- THEY'RE
		;PART OF SAME PAGE.
	CALL GETC
	CAIE CHR,CR
	CAIN CHR,LF
	JRST .-3
	CAIE CHR,EOL
	CAIN CHR,FORMF
	JRST .-6
	CAIN CHR,200
	JRST LIST8		;EOF, DONE LISTING
	SETZB LNO,BESLNO
	SETZ CNO,
	MOVE A,[POINT 7,[0],-1]
	MOVEM A,BESPTR		;EMPTY TEXT CARRIED OVER FROM PREVIOUS PAGE
	AOS PAGENO
		;FALL INTO LSTTOP, FIRST CHAR OF PAGE IN "CHR"
;LSTTOP LSP2A LSTP2B LSTP2C

;LIST/TYPE...   TOP OF PAGE LOOP.  DETERMINE WHETHER PAGE WILL PRINT.

LSTTOP:	HLRZ A,@PPRINT		;MIN OF GROUP OF PAGES TO PRINT
	JUMPE A,LIST8		;END OF PAGES TO PRINT BLOCK, DONE THIS FILE
	CAMLE A,PAGENO
	JRST LSKIP		;SKIP PAGE
	HRRZ A,@PPRINT		;MAX OF SAME GROUP
	CAMGE A,PAGENO
	JRST [	AOS PPRINT		;BEYOND THIS GROUP, GET NEXT
		JRST LSTTOP]
	TLZ F,B4		;WILL PRINT, TURN ON PRINTING.
	TRO F,1B19		;SAY THAT SOME OUTPUT HAS BEEN GENERATED

;PRINT PAGE. FIRST HEADING AND PAGE NUMBER
	TLNE F,B14
	JRST [		;PAUSE BEFORE EACH PAGE REQUESTED
		PRINT BELL		;RING CONTROLLING TTY BELL
		MOVE A,CIJFN
		BIN		;USER SHOULD TYPE EOL
		MOVE A,COJFN
		JRST LSP2A]
	MOVE A,OUTDSG
	MOVEI B,CR
	BOUT
	MOVEI B,LF
	BOUT
LSP2A:	SETZ C,
	MOVE B,HEAD		;HEADING STRING, INCL "PAGE "
	JUMPE B,LSTP2C		;NO HEADING OR PAGE #'S AT ALL
	SOUT
	TLNE F,B3
	JRST LSTP2B		;NO PAGE #
	MOVE B,PAGENO
	MOVEI C,↑D10
	NOUT		;PAGE NO
	 CALL JERRC
	SKIPN PAGEN1
	JRST LSTP2B
	MOVEI B,":"
	BOUT
	MOVE B,PAGEN1
	NOUT
	 CALL JERRC
LSTP2B:	MOVEI B,CR
	BOUT
	MOVEI B,LF
	MOVE C,SPCG
	ADDI C,3		;SPACING + 2 EOLS
	BOUT
	SOJG C,.-1
LSTP2C:	ADD LNO,HEDLNO		;ACCOUNT LINES IN TITLE, INCL EOLS B4 AND AFTER
;LSTCL LSTCL1 LSTCL2

;LIST/TYPE...   PRINT TEXT CARRIED FORWARD FROM PREVIOUS PAGE
;(NULL IF PREVIOUS PAGE NOT LISTED OR ↑L FOUND, BUT NON-NULL AFTER
;OVERLONG PAGE BROKEN AT BEST POINT)
		;MOVE A,OUTDSG
	MOVE B,CHR
	CAIE CHR,200		;NULL FILE CASE EOF
	BOUT		;THE FIRST CHARACTER OF PAGE IS IN "CHR"
	MOVE B,BESPTR		;POINTER TO UNOUTPUT TEXT IN OUTPUT BUFFER
	SETZ C,
	SOUT
;INIT TO DO PAGE
	SUB LNO,BESLNO		;REDUCE LINE # BY # LINES PRINTED ON LAST PAGE
		;THIS SHOULD LEAVE LNO SET TO NUMBER OF EOLS
		;IN TEXT JUST PRINTED
	MOVE OUTPTR,[POINT 7,BUF2,-1] ;WHERE TO STORE TEXT TO BE OUTPUT
	MOVNI B,B0		;SET SCORE OF BEST PLACE YET SEEN TO BREAK
	MOVEM B,BESCOR		;PAGE TO MINUS INFINITY
	MOVEM OUTPTR,BESPTR		;JUST IN CASE
	MOVEM LNO,BESLNO		;...
	TLZ F,B5+B6		;DON'T KNOW WHETHER LAST LINE WAS COMMENT OR NOT
;CHARACTER LOOP.
;CHARACTERS ARE READ AND BUFFERED.
;EOLS AFTER LINE "35" ARE SCORED AS POSSIBLE PAGE BREAK POINTS;
;PRINTING DOES NOT OCCUR TIL ↑L OR "60"TH EOL.

LSTCL:	CALL GETC
LSTCL1:	CAIE CHR,200		;EOF
	CAIN CHR,FORMF		;↑L
	JRST LSPFF		;GO PRINT TO HERE
	CAIE CHR,EOL
	CAIN CHR,LF
	JRST .+2		;END OF LINE
	JRST LSTCL		;ANY OTHER CHAR, LOOP.
;HAVE EOL
	CAML LNO,L35
	JRST LSTCL2
	MOVEM OUTPTR,BESPTR ;SAVE AS A BREAK POINT IN CASE NO 
	MOVEM LNO,BESLNO		;...LINES BETWEEN "35" AND "60" DUE TO
	JRST LSTCL		;...SMALL LENGTH AND LARGE SPACING
;HAVE AN EOL BEYOND LINE "35". IF BEYOND "LENGTH", PRINT.

LSTCL2:	CAMLE LNO,LENGTH		;OFF BOTTOM OF PAGE?
	JRST LSPNFF		;YES, PRINT TO HIGHEST-SCORING BREAK SEEN
;LSTC3A LSTC3B LSTC3C

;LIST/TYPE...   HAVE EOL, SCORE BREAK AT THIS POINT
	PUSH P,OUTPTR
	PUSH P,LNO
		;WIDTH OVERFLOW FORCED EOL: BASIC SCORE IS -200
	TLNE F,B8
	JRST [	HRROI E,-↑D200
		CALL GETC
		JRST LSTC3X]
	SETZ E,		;INITIALIZE SCORE
		;SCAN PAST EOLS & BLANKS, SCORING +10 PER EOL,
		;-1 PER COLUMN INDENTATION
LSTC3A:	CALL GETC
	CAIN CHR,CR
	JRST LSTC3A
	CAIE CHR,LF
	CAIN CHR,EOL
	JRST [	ADDI E,↑D10
		TLZ F,B5		;IMMEDIATELY PRECEDING LINE NOT COMMENT
		JRST LSTC3A]
	CAIE CHR,200		;EOF
	CAIN CHR,FORMF		;FORM FEED AFTER EOL(S)
	JRST [	POP P,BESLNO		;PRINT TO BEFORE THE EOLS (WHICH MIGHT
		POP P,BESPTR		;HAVE CROSSED PAGE LENGTH)
		JRST LSPFF1]
	JRST .+2
LSTC3B:	CALL GETC		;AFTER SPACE-TAB DON'T CHECK FOR FF: IF BEYOND
		;PAGE LENGTH THEN ITS ON NEXT PAGE.
	CAIN CHR," "
	SOJA E,LSTC3B
	CAIN CHR,TAB
	JRST [	SUBI E,10
		JRST LSTC3B]
		;NOW IF WE ARE AT LEFT MARGIN, ADJUST FOR COMMENTS
	CAILE CNO,1
	JRST LSTC3D
	CAIN CHR,"!"
	JRST LSTC3C
	CAIE CHR,"$"		;FOR FORTRAN
	CAIN CHR,"/"		; "    "
	JRST LSTC3C
	CAIE CHR,";"
	CAIN CHR,"*"
LSTC3C:	JRST [	TLZE F,B6
		ADDI E,↑D50		;+50 IF PREVIOUS LINE NO COMMENT
		TLOE F,B5		;-20 IF LAST LINE WAS COMMENT, TO AVOID
		SUBI E,↑D20		;BREAKING UP BLOCKS OF COMMENTS
		JRST LSTC3X]
		;-100 FOR ), ] AT LEFT MARGIN, FOR LISP PRETTYPRINT LISTINGS
	CAIE CHR,")"
	CAIN CHR,"]"
	SUBI E,↑D100
;LSTC3D LSTC3X

;LIST/TYPE... SCORING BREAK AT EOL...
		;IF HERE, THIS LINE WAS NOT COMMENT AT LEFT MARGIN
LSTC3D:	TLZ F,B5
	TLO F,B6
		;NOW REDUCE ALL SCORES BY # LINES AWAY FROM "50"
LSTC3X:	MOVE A,L50
	SUB A,(P)		;LNO SAVED BEFORE SCANNING PAST EOLS
	MOVM A,A
	SUB E,A
		;UPDATE BEST BREAK SEEN IF THIS ONE IS BETTER
	CAML E,BESCOR
	JRST [	POP P,BESLNO		;THIS ONE IS BETTER
		POP P,BESPTR
		MOVEM E,BESCOR
		JRST .+2]
	SUB P,[2,,2]
	JRST LSTCL1
;LSPNFF LSPFF LSPFF1 LSTP1 LSTP15

;PRINT PAGE

;NO FORM FEED, PRINT TO BEST BREAK SEEN

LSPNFF:	AOS PAGEN1
	JRST LSTP1

;FORM FEED OR EOF, PRINT TO HERE

LSPFF:	CAML LNO,LENGTH		;IF BEYOND BOTTOM OF PAGE,PRINT INSTEAD
	JRST LSPNFF		;TO BEST PRECEDING BREAK
	MOVEM OUTPTR,BESPTR	;MAKE THIS POINT THE BEST BREAK SEEN
	MOVEM LNO,BESLNO		;..
LSPFF1:	AOS PAGENO		;FF AFTER EOL JOINS HERE (LSTC3A)
	SETZM PAGEN1

;PRINT OUTBUF TO BESPTR EXCEPT THE FINAL EOL OR FF

LSTP1:	MOVE A,BESPTR
	BKJFN			;BACK UP ONE CHARACTER
	 CALL JERR
	MOVEM A,BESPTR
	MOVE D,BESPTR
	ILDB E,D		;GET CHAR AFTER BEST BREAK
	CAIE E,LF
	CAIN E,EOL
	SOS BESLNO		;UNACCOUNT FOR BACKUP
	CAIE E,LF		;ON LF BACK UP OVER PRECEDING CR
	 JRST LSTP15		;NOT A LF
	LDB A,A			;GET CHR JUST BEFORE LINEFEED
	CAIN A,CR
	JRST LSTP1		;GO BACK UP AGAIN
LSTP15:	LDB A,[POINT 6,D,5]	;NUMBER OF BITS LEFT IN LAST WORD
	IDIVI A,7		;NUMBER OF CHRS
	MOVEI C,BUF2-1		;BEG OF OUTPUT BUF MINUS 5 CHRS
	SUBI C,0(D)		;NUMBER OF FULL AND PARTIAL WORDS
	IMULI C,5		;NUMBER OF CHRS THEREIN
	ADDI C,1(A)		;NEG CHR CNT (NOT INC. CHR AT "BESPTR")
	JUMPGE C,LSTP19		;NO CHAR'S TO BE OUTPUT
	MOVE A,OUTDSG
	HRROI B,BUF2
	SOUT			;PRINT 
;LSTP19 LSTP2

;LIST/TYPE...   PRINT PAGE...
;AFTER PRINTING PASS EOLS AND ↑L'S, PRINTING THOSE THAT WILL FIT PAGE,
;THEN SEND A REAL FORM FEED.
LSTP19:	TLZ F,B10		;PERMIT PRINTING
LSTP2:	MOVE A,OUTPTR
	SETZ C,
	IDPB C,A		;TERMINATE OUTBUF
	CALL GGETC		;GET CHR FROM OUTPUF IF NOT ALL USED UP,
				;ELSE FROM INBUF
	MOVE A,OUTDSG
	SETZ C,
	CAIN CHR,FORMF
	JRST [	HRROI B,[ASCIZ /↑L/]
		TLNN F,B10
		SOUT
		JRST LSTP2]
	CAIN CHR,CR
	JRST [	MOVE D,BESLNO
		AOJA D,[CAML D,LENGTH	;IS PAGE TOO FULL FOR LF AFTER?
			TLO F,B10	;YES, SUPPRESS PRINTING
			MOVE B,CHR
			TLNN F,B10
			BOUT
			JRST LSTP2]]
	CAIE CHR,EOL
	CAIN CHR,LF
	JRST [	AOS D,BESLNO
		JRST [	CAML D,LENGTH	;PAGE FULL?
			TLO F,B10	;YES, SAY NO PRINT
			MOVE B,CHR
			TLNN F,B10
			BOUT
			JRST LSTP2]]
	IDPB C,OUTPTR		;TERMINATE CARRY-OVER TEXT
	MOVEI B,FORMF
	BOUT			;REAL FORM FEED
	CAIE CHR,200		;EOF ?
	JRST LSTTOP		;NO, GO DO NEXT PAGE, ITS 1ST CHAR IN "CHR"
;LIST8 LIST9 LIST91

;LIST/TYPE...
;END-OF-FILE HAS BEEN PROCESSED

LIST8:	CALL GNFIL		;GET NEXT FILE IN INPUT GROUP
	JRST LIST9		;R1: NO MORE
	JRST LSTFL		;R2: HAVE IT, GO BACK AND LIST IT.

;ALL DONE LISTING FILES

LIST9:	TRNN F,1B19		;IF NO OUTPUT WAS ACTUALLY GENERATED
	 JRST [	MOVE A,OUTDSG	;ATTEMPT TO DELETE THE (EMPTR) OUT FILE
		DELF
		 JFCL
		JRST LIST91]	;BYPASS EXTRA EOL AND PRINTER WATCH ON
		;SEND ONE LAST EOL (NOT DONE EXCEPT AFTER LAST FILE
		;BECAUSE IN OTHER CASES NEXT PAGE BEGINS WITH EOL OR PAUSE)
	MOVE A,OUTDSG
	MOVEI B,CR
	BOUT
	MOVEI B,LF
	BOUT

;	TLNE F,(1B0)		;"WATCH"
;	SETZM PRNTIM		;YES, ENABLE CHECKING
				;UNMAP STORAGE PAGES
LIST91:	CALL UNMDIR		;SUBROUTINE IN X3CMD.MAC THAT UNMAPS PAGES
		;BUF1 TO 767.
		;RELEASE JFNS
	CALL RLJFNS
		;IF REQUESTED BY SUBCOMMAND, GO LOGOUT
	TLNN F,B17
	JRST CMDIN4		;GO BACK TO COMMAND INPUT (NORMAL CASE)
	SETO A,			;LOGOUT
	LGOUT
	 CALL JERR
;GGETC GETC


;LIST/TYPE SUBROUTINES

;GGETC
;GET CHAR FROM OUTBUF CARRY-OVER (BESPTR) IF ANY, ELSE FROM INPUT FILE.
;CLOBBERS A-D

GGETC:	MOVE A,BESPTR
	ILDB CHR,A
	JUMPN CHR,[MOVEM A,BESPTR
		RET]
		;OUTBUF EMPTY, GET CHAR(S) INTO IT THEN REENTER GGETC
		;TO GET THEM OUT.  THIS METHOD SIMPLIFIES CORRECT
		;MULTIPLE-SPACING AFTER EOLS IN ALL FUNNY CASES AT END OF PAGE.
	CALL GETC
	CAIE CHR,200
	JRST GGETC
	RET		;200 FOR EOF ISN'T PUT IN OUTBUF

;GETC
;GET CHARACTER FROM INPUT FILE,
;PUTTING IT IN OUTBUF, KEEPING TRACK OF CHARACTER POSITION ON PAGE,
;INSERTING EOLS FOR LINE WIDTH OVERFLOW AND MULTIPLE SPACING, ETC.
;CLOBBERS A-D.

GETC:	TLNE F,B7+B8+B12+B13
	JRST GETC20		;GO HANDLE SPECIAL CONDITIONS
;GET CHARACTER FROM INPUT BUFFER
	ILDB CHR,INPTR
	SUBI CNT,1		;UPDATE COUNT OF CHARS REMAINING
	JUMPE CHR,[;NULL ENCOUNTERED.  THIS IS END OF BUFFER ONLY IF
		;COUNT ALSO USED UP, SO NULLS IN A BAD FILE DON'T
		;CAUSE LOSS OF FOLLOWING GOOD DATA IN SAME BUFFER.
		;COUNT IS DISREGARDED TIL A NULL TO PERMIT USE IN
		;SCANNING DEFAULT HEADING, AN ASCIZ STRING OF UNKNOWN
		;LENGTH.
		JUMPG CNT,.+1		;NOT END OF BUFFER, TRANSMIT NULL.
		TLNE F,B11		;DID READING THIS BUFFER HIT EOF?
		JRST [	TLO F,B12		;YES, SAY ALL CHARS NOW USED
			JRST GETC]		;REENTER GETC TO RET SPEC CODE.
		MOVE INPTR,[POINT 7,INBUF,-1]
		HRRZ A,@INIFH1
		MOVE B,INPTR
		MOVEI CNT,INBUFL
		MOVE C,CNT
		TLNN F,B15		;IF NOT TTY:, THEN..
		MOVNI C,INBUFL		;USE NEG. SIN COUNT FOR SPEED
		MOVEI D,CTRLZ		;END ON ↑Z FOR TTY
		SIN		;READ A BUFFERFUL
		JRST LSTE1]	;GO COMPUTE COUNT
;GETC4 GETC4A GETC7 GETC8

;LIST/TYPE SUBR GETC...
;FOR TTY SOURCE ↑Z IS EOF
	CAIN CHR,CTRLZ
	JRST [	TLNN F,B15
		JRST .+1
		SETZM EOFDSP
		TLO F,B12
		JRST GETC]
;IF NOT PRINTING, DON'T STORE OR ACCOUNT CHAR POSITION
	TLNE F,B4
	RET
;ACCOUNT CHARACTER POSITION AND SO ON

GETC4:	CAIG CHR,37
	JRST GETC10		;CONTROL CHAR
		;ALL OTHER CHARS SPACE ONE
GETC4A:	MOVEI CNO,1(CNO)
GETC7:	CAMLE CNO,WIDTH
	JRST [		;PAGE WIDTH OVERFLOW
		MOVE A,INPTR
		BKJFN		;PUT CHAR BACK IN BUFFER
		 CALL JERR
		MOVE INPTR,A
		MOVEI CHR,EOL		;RETURN EOL
		TLO F,B8		;SAY IT WAS FORCED EOL
		TLZ F,B9		;SAY NOT CONTROL CHAR TO INDICATE W ↑X
		JRST GETC4]
;STORE CHAR IN OUTBUF AND RETURN

GETC8:	TLZE F,B9
	JRST [		;INDICATE CONTROL CHARACTER WITH ↑X
		MOVEI B,"↑"
		IDPB B,OUTPTR
		MOVEI B,100(CHR)
		IDPB B,OUTPTR
		RET]
	IDPB CHR,OUTPTR		;STORE CHAR FOR PRINTOUT
	RET
;GETC10 GETC11

;LIST/TYPE SUBROUTINE GETC...
;CONTROL CHARACTERS

GETC10:	TLNN F,B2		;INDICATING NULLS,...
	JUMPE CHR,GETC		;OR NOT A NULL
	CAIN CHR,TAB
	JRST [	ADDI CNO,10	;ASSUME TAB STOPS EVERY 8 COLUMNS
		TRZ CNO,7
		JRST GETC7]
	CAIN CHR,EOL
	 JRST [	SETZ CNO,
		TLO F,B13	;SAY TO OUPUT AN LF NEXT CALL
		MOVEI CHR,CR	;BUT DO A RETURN THIS TIME
		JRST GETC8]
	CAIN CHR,LF
GETC11:	JRST [	MOVEI LNO,1(LNO)
		SKIPE SPCG	;IF SPACING >1,
		TLO F,B7	;SAY DO MULTIPLE-SPACING ON NEXT CALL
		JRST GETC8]
	CAIN CHR,CR
	JRST [	SETZ CNO,
		JRST GETC8]
	CAIN CHR,FORMF
	JRST GETC8		;FORMFEED ISN'T ACCOUNTED AT GETC LEVEL

;REMAINING CONTROLS ARE EITHER INDICATED (↑X, 2 COLS) OR SENT (1 COL)

	TRNE F,1B18		;"VERBATIM"
	 JRST [	CAIN CHR,10	;BACKSPACE?
		 SOJGE CNO,GETC7;YES COUNT AS -1 UNLESS AT LEFT MARGIN
		AOJA CNO,GETC7]	;NO, COUNT AS +1
	TLO F,B9		;REMEMBER THIS SPECIAL CASE
	MOVEI CNO,2(CNO)	;↑X TAKES 2 COLUMNS
	JRST GETC7
;GETC20 LSTEOF LSTE1

;LIST/TYPE SUBROUTINE GETC...
;SPECIAL FLAG(S) ON AT (RE)ENTRY

GETC20:	TLNE F,B12
	JRST [	MOVEI CHR,200		;AT EOF, RETURN SPECIAL CODE 200
		JRST GETC8]		;PUT NULL IN OUTBUF
	TLZE F,B13		;LAST CALL OUTPUT CR IN PLACE OF EOL
	 JRST [	MOVEI CHR,LF	;STUFF OUT LF THIS TIME
		JRST GETC11]
	TLNE F,B4
	JRST [	TLZ F,B7+B8		;NOT PRINTING, DONT PROCESS THESE
		JRST GETC]		;SPECIAL CASES
	TLZE F,B8
	JRST [		;ON CALL AFTER LINE WIDTH OVERFLOW FORCED EOL, STORE **
		;NOTE THAT FORCED EOLS ALWAYS SINGLE-SPACE
		TLZ F,B7
		MOVE C,WIDTH	;SPACE HALFWAY ACROSS LINE TO CONTINUE
		ASH C,-1
		ADD CNO,C
		MOVEI B," "
		JSP D,[JRST 0(D)] ;REMEMBER 'POINT'
		IDPB B,OUTPTR
		SOJG C,0(D)	; .-1 ACTUALLY...
		MOVEI B,"*"
		IDPB B,OUTPTR
		IDPB B,OUTPTR
		MOVEI CNO,2(CNO)
		CAML CNO,WIDTH		;FOR SAFETY: OTHERWISE IF WIDTH IS 0
		CALL SCREWUP		;EXEC IS WIPED OUT BY HEADING
		JRST GETC]		;REENTER GETC TO GET CHARACTER
	TLZN F,B7
	CALL SCREWUP


;ON CALL AFTER EOL OR LF, STORE EXTRA CRLF + LF'S FOR MULT SPACING
	MOVE D,SPCG
	ADD LNO,D
	MOVEI B,CR
	IDPB B,OUTPTR
	MOVEI B,LF
	IDPB B,OUTPTR
	SOJG D,.-1
	JRST GETC		;REENTER GETC TO GET CHARACTER

;LIST/TYPE EOF PSI ROUTINE. CAN ONLY BE ENTERED DURING CALL TO GETC.

LSTEOF:	SETZM EOFDSP		;JUST TO BE SURE
	TLO F,B11		;SAY EOF ENCOUNTERED
LSTE1:	MOVMS C
	SUB CNT,C		;COMPUTE NUMBER CHARS READ
	SETZ C,
	IDPB C,B		;TERMINATE WITH NULL!
	JRST GETC		;GET CHAR FROM BUFFERFUL JUST READ, AND
				;CONTINUE NORMALLY TILL BUFFER USED.
;COMCHR COMCH1 COMCH2 COMCHX STRCOM STRCO1 STRCO2 EXTTAB

;LIST/TYPE ...

;OUTPUT THE COMMENT CHARACTER INTO THE HEADING STRING
;CHARCRER (STRING) IS DETERMAMINED FROM FILE EXTENSION

;1:	OUTPUT STRING POINTER
;	CALL COMCHR
;R+1:	ALWAYS, 1 UPDATED

COMCHR:	PUSH P,1
	PUSH P,2
	PUSH P,3
	SETOM (1)		;IN CASE NO EXTENSION
	HRRZ 2,@INIFH1		;CURRENT JFN
	MOVSI 3,(1B11)		;EXT ONLY
	JFNS

COMCH1:	MOVSI 3,-EXTL
COMCH2:	MOVSI 2,(POINT 7,)
	HLR 2,EXTTAB(3)
	MOVE 1,-2(P)		;WHERE EXT WRITTEN
	CALL STRCOM		;COMPARE STRINGS
	 JRST [	AOBJN 3,COMCH2	;NOT EQUAL, TRY NEXT
		MOVEI 2,";"	;USE  ;  IF NOTHING ELSE
		MOVE 1,-2(P)
		BOUT
		JRST COMCHX]
	HRRO 2,EXTTAB(3)
	SETZ 3,
	MOVE 1,-2(P)
	SOUT
COMCHX:	POP P,3
	POP P,2
	SUB P,[1,,1]
	RET


;STRING COMPARE

;1:	STRING POINTER
;2:	STRING POINTER
;	CALL STRCOM
;R+1:	 NOT EQUAL
;R+2:	EQUAL

STRCOM:	PUSH P,1
	PUSH P,2
STRCO1:	ILDB 1,-1(P)
	ILDB 2,0(P)
	CAIE 1,0(2)
	 JRST STRCO2
	JUMPN 1,STRCO1
	AOS -2(P)
STRCO2:	POP P,2
	POP P,1
	RET


DEFINE ETAB(TRANS,COMMNT)<[ASCIZ \TRANS\],,[ASCIZ \COMMNT\]>

EXTTAB:	ETAB (MAC,<;>)
	ETAB (MID,<;>)		; FOO, BBN, MIDAS DOESN'T USE SLASH!
	ETAB (FAI,<;>)
	ETAB (PAL,</>)
	ETAB (BCP,<//>)
	ETAB (F4,<C>)
	ETAB (F40,<C>)
	ETAB (FOR,<C>)
	ETAB (F10,<C>)
	ETAB (P11,<;>)
	ETAB (BLI,<!>)
	ETAB (PPL,<... >)	;(HOMNEST!)
EXTL==.-EXTTAB
;SITEO SITEX LITC4A

;LIST/TYPE ...

;SUBROUTINE TO OUTPUT SITE ON DESIGNATOR IN A

;RETURNS A UPDATED IF STRING POINTER

SITEO:	PUSH P,B
	PUSH P,C
	PUSH P,A
	MOVE A,['LHOSTN']
	CALL $SYSGT
	JUMPE B,SITEX
	MOVEI A,0(B)		;FORM 0,,TABLE
	GETAB
	 JRST SITEX
	EXCH A,0(P)		;GET BACK OUTPUT PTR, SAVE SITE #
	MOVEI B,"["
	BOUT
	POP P,B			;SITE #
	MOVEI C,↑D10		;FOR NOUT
	CVHST			;HOST TO STRING CONVERSION
	 NOUT			;FAILING THAT, A NUMBER
	  JFCL
	MOVEI B,"]"
	BOUT
	CAIA
SITEX:	POP P,A
	POP P,C
	POP P,B
	RET


LITC4A:	XLIST
	LIT
	LIST
;.DETAC .REDIR RED2

;"REDIRECT" AND "DETACH" COMMANDS

;REDIRECT (INFILE) <NAME>/* (OUTFILE) <NAME>/* (AND) START/REENTER/CONT

;DETACH IS SAME SYNTAX AND HAS SAME MEANING EXCEPT IT DETACHES
; TERMINAL AFTER REDIRECTING IO.
;ALL ARGUMENTS CAN BE OMITTED AND DEFAULT TO NULL

.DETAC:	TLO Z,DTACHF		;SET "DETACH" FLAG
.REDIR:				;"REDIRECT": FLAG IS ALREADY CLEAR.

;DECODE ARGUMENTS

;GET INPUT FILE NAME, OR "*" FOR OLD, OR NULL OR "-" FOR NO CHANGE
	NOISE <infile>
	MOVE A,[1,,[ASCIZ /INP/]]	;"ALLOW *" FLAG, DEFAULT EXT
	CALL CINFN		;INPUT A FILE NAME, *, -, OR NULL
	 JRST [	PUSH P,A	;NOT A FILE NAME (* OR -)
		MOVE A,[1,,1];STEP JFN BUFFER PTR PAST CJFN1,
		ADDM A,JBUFP	;SO COUTFN WON'T CLOBBER IT.
		POP P,A
		CAIE A,"*"	;HOW CINFN INDICATES "*"
		JRST [	SETOM CJFN1	;SAY NO INPUT REDIRECTION FILE
			JRST RED2]	;NULL OR "-"
		SKIPG CREDIF	;*. IS THERE A PREVIOUS FILE?
		UERR [ASCIZ /No previous input file/]
		MOVE A,CRJFNI	;OLD INPUT JFN FROM BEFORE ↑C
		GTSTS		;GET JFN'S CURRENT STATUS
		TLNN B,200	;JFN STILL VALID? (USER CD HAVE FLUSHED)
		JRST [	SETZM CREDIF		;INVALID, FORGET IT
			UERR [ASCIZ /Old input file has been closed & released/]]
		TLNE B,B0	;OPEN?
		TLNN B,B1	;FOR INPUT?
		JRST [		;JFN IS ASSOCIATED WITH A FILE, BUT FILE
				;ISN'T OPEN FOR INPUT.
				;IDEALLY WE SHOULD HAVE SAVED THE OLD
				;FILE POINTER TO RESTORE AND CONTINUE.
				;(AND ALSO I GUESS THE FILE'S NAME TO BE
				;SURE USER HASN'T OPENED ANOTHER FILE
				;WITH SAME JFN.)  FOR NOW, ERROR.
			UERR [ASCIZ /Old input file has been closed/]]
			JRST .+1]	;ITS OK.
	MOVEM A,CJFN1		;JFN FROM CINFN OR CRJFNI
	SKIPGE CREDIF
	ERROR <Input already redirected>
RED2:	ALLOW TALT+TSPC+TEOL+TLPR
;RED3 RED4

;DECODING OF REDIRECT/DETACH...

;OUTFILE SIMILALARLY

	NOISE <outfile>
	MOVE A,[1,,[ASCIZ /OUT/]]
	CALL COUTFN
	 JRST [	CAIE A,"*"
		JRST [	SETOM CJFN2
			JRST RED4]
		SKIPG CREDOF
		UERR [ASCIZ /No previous output file/]
		MOVE A,CRJFNO
		GTSTS			;CHECK ITS VALIDITY
		TLNN B,200
		JRST [	SETZM CREDOF	;BAD JFN, FORGET ABOUT IT
			UERR [ASCIZ /Old output file has been closed & released/]]
		TLNE B,B0		;OPEN?
		TLNN B,B2		;FOR WRITE?
		 JRST [	UERR [ASCIZ /old output file has been closed/]]
		JRST RED3]
	TLO KWV1,CONMAN		;IF FILE NAME WAS GIVEN, CONF. MANDATORY
	TRNE CBT,TSPC		;IF FILE NAME WAS TERMINATED WITH SPACE,
	PRINT " "		;TYPE SPACE AFTER "[OLD/NEW FILE]"
RED3:	MOVEM A,CJFN2
	SKIPGE CREDOF
	ERROR <Output already redirected>
RED4:	ALLOW TALT+TSPC+TEOL+TLPR

;START/REENTER/CONTINUE ARGUMENT

	NOISE <and>
	KEYWD $REDIR
	 T -,EOLOK,<[..DTCH,,[RET]]>		;DEFAULT TO NOTHING
	 ERROR <START, REENTER, CONTINUE, or nothing>

;KWV POINTS TO A WD WHOSE RH POINTS TO A SUBR TO FINISH DECODING
;  AND CHECK THE ARGUMENT.
	MOVE A,(KWV)
	CALL (A)	;CALL ARGUMENT-DEPENDENT DECODE & CHECK SUBR
	CONFIRM
;REDIRECT/DETACH...
;EXECUTE REDIRECT/DETACH COMMANDS
;NOW HAVE JFN'S IN CJFN1 & 2, PTR TO START/REE/CON/NOTHING IN KWV.

;EXECUTION BEGINS WITH REDIRECTING THE I/O.
;IT APPEARS THAT WE MUST FLUSH OLD SAVED PRIMARY FILES BEFORE
; REDIRECTING TO THE NEW ONES IN ORDER TO AVOID A HORRENDOUSLY
; COMPLICATED PROBLEM OF KEEPING TRACK OF EVERYTHING AND MAKING
; THE RIGHT THING HAPPEN ON ERRORS AND ↑C'S WHICH OCCUR
; DURING THE REDIRECTION PROCESS.
;THIS MEANS THAT IF COMMAND DOESN'T COMPLETE SUCCESSFULLY THE
; OLD FILES MAY NEVERTHELESS BE CLOSED.

	TLNE Z,DTACHF
	ETYPE < Detaching job # %J
>
;REDI0 REDI1 REDI2 REDI3 REDI4

;EXECUTION OF REDIRECT/DETACH...
;REDIRECT INPUT
; CLOSE OLD FILE
REDI0:	MOVE A,CRJFNI
	MOVE B,CREDIF
	CAIN B,1		;IS THERE AN OLD ONE?
	CAMN A,CJFN1		;YES, IS IT DIFFERENT FROM NEW?
	 JRST REDI2		;NO OR NO: NO OLD ONE, OR "*" GIVEN.
	GTSTS			;GET CURRENT STATUS OF THIS OLD JFN
	TLNN B,200
	 JRST REDI1		;NO GOOD, FORGET IT.
	TLNN B,B0
	 JRST [	RLJFN		;GOOD BUT NOT OPEN, JUST RELEASE IT
		 CALL JERR
		JRST REDI1]
	CLOSF			;CLOSE OLD ONE & RELEASE JFN
	 CALL JERR
REDI1:	SETZM CREDIF		;SAY THERE'S NO LONGER AN OLD ONE


; OPEN NEW INPUT FILE IF NOT OPEN
; (NOTE THAT IF * GIVEN IT WILL TYPICALLY BE OPEN)

REDI2:	MOVE A,CJFN1		;JFN OF NEW PRI INPUT FILE
	JUMPL A,REDI4		;-1 MEANS NONE SPECIFIED
	GTSTS			;GET ITS STATUS
	TLNN B,200
	 CALL SCREWUP		;BUG IF BAD JFN GETS THIS FAR.
	TLNE B,B1
	 JRST REDI3		;ALREADY OPEN FOR READ
	MOVE B,[7B5+0B9+1B19]	;7 BIT ASCII READ
	OPENF
	 CALL JERR

REDI3:	INTOFF			;BE SURE CREDIF AND SPJFN AGREE
	GPJFN
	HRL 2,CJFN1		;NEW INPUT JFN
	SPJFN
	SETOM CREDIF		;INDICATE INPUT NOW REDIRECTED
	INTON
REDI4:
;REDO0 REDO1 REDO2 REDO3 REDO4

;REDIRECT/DETACH...
;EXECUTION...
;REDIRECT OUTPUT
; CLOSE OLD FILE IF THERE IS ONE AND IT'S NOT TO BE REUSED
REDO0:	MOVE A,CRJFNO
	MOVE B,CREDOF
	CAIN B,1
	CAMN A,CJFN2
	 JRST REDO2
	GTSTS		;MAKE SURE ITS GOOD AND OPEN BEFORE CLOSING
	TLNN B,200
	 JRST REDO1		;BAD, FORGET IT
	TLNN B,B0
	 JRST [	RLJFN		;GOOD BUT CLOSED, JUST RELEASE
		 CALL JERR
		JRST REDO1]
	CLOSF		;GOOD AND OPEN, CLOSE AND RELEASE.
	 CALL JERR
REDO1:	SETZM CREDOF

; OPEN NEW FILE, IF ANY

REDO2:	MOVE A,CJFN2
	JUMPL A,REDO4		;NO NEW FILE
	GTSTS
	TLNN B,200
	 CALL SCREWUP		;BAD JFN SHOULDN'T GET THIS FAR
	TLNE B,B2		;OPEN FOR OUTPUT?
	 JRST REDO3		;ALREADY OPEN FOR WRITING.
	MOVE B,[7B5+0B9+1B20]	;7 BIT ASCII WRITE
	OPENF
	 CALL JERR

REDO3:	INTOFF
	GPJFN
	HRR 2,CJFN2		;NEW OUTPUT JFN
	SPJFN
	SETOM CREDOF
	INTON
REDO4:	MOVEI E,ETTYMD		;TTY MODES FOR USE WHEN EXEC IS RUNNING
	CALL LTTYMD		;PUT SAME INTO EFFECT NOW.
;$REDIR ..DTCH

;REDIRECT/DETACH...
;EXECUTION...

;I/O ALL REDIRECTED, NOW START/REENTER/CONTINUE.
;KWV POINTS TO WD WHOSE LH POINTS TO ROUTINE TO START THE FORK (OR NOT),
; DETACH TERMINAL IF "DTACHF" ON, WAIT FOR TERMINATION.
	HLRZ A,(KWV)
	JRST (A)		;DISPATCH TO
		;FINAL-ARGUMENT-DEPENDENT EXECUTION ROUTINE

;TABLE FOR THIRD ARGUMENT
;VALUE POINTS TO A WORD -- 
;	RH: DECODE-AND-CHECK SUBR ADDRESS
;	LH: EXECUTION DISPATCH ADDRESS

$REDIR:	TABLE
	T CONTINUE,EOLOK,<[..CONT,,$CONTI]>
	T REENTER,EOLOK,<[..REEN,,$REENT]>
	T START,EOLOK,<[..STRT,,$START]>
	TEND

;EXECUTION ROUTINE FOR NULL THIRD ARGUMENT

..DTCH:	TLNE Z,DTACHF
	DTACH
	JRST CMDIN4

;..CONT, ..REEN, ..STRT ARE WITH THE CORRESPONDING COMMANDS.
SUBTTL PDP-10 TENEX EXECUTIVE  ** X3CMD.MAC **

;ROUTINES TO DECODE AND EXECUTE SPECIFIC COMMANDS.
;THIS FILE CONTAINS LONG AND NOT PARTICULARLY COMMON
;COMMANDS, SEGREGATED FROM THE OTHER, SHORTER, COMMAND
;ROUTINES TO REDUCE THE EXEC'S NORMAL WORKING PAGE SET.

;CONTENTS
;	ARCHIVE
;	QFD
;	DIRECTORY

;	QD, QW, QR

;DEFINITIONS REQUIRED FOR DIRECTORY LISTER

DIRORG=760000		;BASE OF 8-PAGE AREA WHERE DIRECTORY IS MAPPED

;DIRECTORY FIXED ALLOCATION AREA
;DIRLCK==DIRORG+0
;DIRUSE==DIRORG+1
DIRNUM==DIRORG+2		;DIRECTORY NUMBER
SYMBOT==DIRORG+3		;BEGINNING OF SYMBOL TABLE
SYMTOP==DIRORG+4		;END OF SYMBOL TABLE

;FILE DESCRIPTOR BLOCK
FDBCTL==1		;CONTROL BITS IN LH THIS WORD
	FDBNEX==B2	;SET IF FILE HAS NO EXTENSION & DOESN'T EXIST
	FDBNXF==B4	;FILE DOESN'T EXIST BECAUSE 1ST WRITE NOT DONE
FDBEXT==2		;LOC EXT BLOCK,, FDB FOR NEXT EXTENSION
FDBPRT==4		;PROTECTION
FDBUSE==6		;WRITER,, USE COUNT
FDBVER==7		;VERSION #,, LOC FDB FOR NEXT VERSION
FDBACT==10		;ACCOUNT # (NEG) OR STRING BLOCK PTR (POS)
FDBSIZ==12		;SIZE IN BYTES (COUNT THAT WOULD ADDRESS EOF)
FDBCRV==13		;VERSION CREATION DATE AND TIME
FDBWRT==14		;WRITE DATE AND TIME
FDBRED==15		;REFERENCE DATE AND TIME
FDBBCK==17		;BACKUP (ARCHIVAL) WORD
			;LH = BITS, RH = MOST RECENT TAPE #
	FDBARC==200000	;ARCHIVE REQUEST
	FDBNAR==100000	;DON'T (EVER) ARCHIVE REQUEST
	AFDBDL==10000	;DON'T DELETE AFTER ARCHIVING
	FDBAAR==4000	;FILE IS ALREADY ARCHIVED
;.ARCHI $ARCHI ARC.FL ARCH3 ARCH1 ARCH2

;ARCHIVE COMMAND
;USE OF F REG:
;	SINCE ONLY THE LEFT 18 BITS OF FDBBCK CAN BE CHANGED
;	(AND SINCE THE LEFT-MOST BIT IS NOT USED BY BSYS)
;	F IS DIVIDED INTO 2 PARTS, GIVING ALL INFO FOR CHFDB
;	LH - NEW VALUES FOR THE BITS IN LH OF FDBBCK
;	(BIT 0 IS USED AS A HACK FOR THE STATUS COMMAND)
;	RH - WHICH BITS TO CHANGE IN LH OF FDBBCK
;	LH AND RH USED BASICALLY AS IN GTFDB AFTER FULL
;	REGISTER EXTENSION

REPEAT 0,<

.ARCHI:	KEYWD $ARCHI
	 0			;NO DEFAULT KEYWORD
	 JRST CERR
	 JRST (KWV)

$ARCHI:	TABLE
	T DELETE,LPROK+LANOK,ARC.DL
	T EXPUNGE,LPROK+LANOK,ARC.EX
	T FILE,COMOK+LPROK+LANOK,ARC.FL
	T RESET,LPROK+LANOK,ARC.RS
	T STATUS,LPROK+LANOK,ARC.ST
	T UNDELETE,LPROK+LANOK,ARC.UN
	TEND

ARC.FL:	NOISE <file list>
	MOVE A,[2,,2]		;DEFAULT NAME AND EXT
	MOVE B,[-2,,B2+B11+B15+B16]	;DEFAULT TO LOWEST VERSION
	CALL $INFG		;GTJFN W/B FLAGS
	;IF SUBCOMMANDS START WITH DEFAULTS AND LET USER ALTER THEM
	 JRST [	MOVE F,[FDBARC,,FDBARC+AFDBDL+FDBNAR]
		CONFIRM		;, TYPED
		SUBCOM $ARC
		JUMPE F,ARCH3	;NO SUBCOMMANDS AFTER ,
		JUMPGE F,ARCH1	;STATUS SUBCOMMAND CAN'T BE MIXED
		TRNE F,377777
		JRST STATER
		JRST ARCH1]
	CONFIRM
	;DEFAULT - ARCHIVE AND DELETE, RESET "DON'T DELETE"
ARCH3:	MOVE F,[FDBARC,,FDBARC+AFDBDL+FDBNAR]
ARCH1:	HRRZ A,@INIFH1		;JFN
	DVCHR
	TLNN B,B4		;DSK (MULT DIR) CHECK
	ERROR <Cannot archive non-disk files>
	HRRZ A,@INIFH1		;GET CONTROL WORD BITS INTO C
	MOVE B,[1,,FDBCTL]
	MOVEI C,C
	CALL $GTFDB
	 SETO C,		;$GTFDB ERROR
	TLNE C,(FDBDEL)		;ERROR IF DELETED UNLESS DOING GROUP
	 JRST [	TLNN Z,GROUPF
		UERR [ASCIZ /Cannot manipulate deleted file/]
		JRST ARCH2]
	MOVE B,[1,,FDBBCK]	;GET BACKUP BITS
	MOVEI C,C
	CALL $GTFDB
	 SETO C,		;$GTFDB ERROR
	JUMPL F,ARCSTR		;SO STATUS IF STATUS
	TLNE C,FDBAAR		;IF ARCHIVED, OK IF DOING GROUP
	 JRST [	TLNN Z,GROUPF
		UETYPE [ASCIZ /File %1S already archived/]
		JRST ARCH2]
	CALL TYPIF		;TYPE FILENAME IF GROUP DESIG.
	HRLI A,FDBBCK		;A - DISP,JFN
	HRLZI B,0(F)		;B - BITS TO CHANGE
	HLLZ C,F		;C - VALUES TO CHANGE TO
	CHFDB

ARCH2:	CALL GNFIL		;GET NEXT FILE
	 JRST RLJFNS		;NO MORE - RELEASE AND EXIT
	JRST ARCH1		;MORE
>
;ARC.DL ARC.UN ARC.EX ARC.RS ARC.ST

REPEAT 0,<

; "ARCHIVE DELETE ..."

ARC.DL:	ALLOW TSPC+TALT
	HRROI B,[ASCIZ /<SYSTEM>ARCHIVE-LOOKUP.SAV/]
	CALL TRYGTJ
	 ERROR <No lookup program???>
	TLO KWV1,PROGX
	MOVEI B,4		;ENTRY VECTOR INDEX FOR DELETE
	JRST CIN40		;RUN IT AS AN EPHEMERON


; "ARCHIVE UNDELETE ..."

ARC.UN:	ALLOW TSPC+TALT
	HRROI B,[ASCIZ /<SYSTEM>ARCHIVE-LOOKUP.SAV/]
	CALL TRYGTJ
	 ERROR <No lookup program???>
	TLO KWV1,PROGX
	MOVEI B,6		;ENTRY VECTOR INDEX FOR UNDELETE
	JRST CIN40		;RUN IT AS AN EPEMERON


; "ARCHIVE EXPUNGE ..."

ARC.EX:	JRST NIYE


; "ARCHIVE RESET ..."

ARC.RS:	NOISE <files>
	MOVE A,[2,,2]
	MOVEI B,B2+B8+B11+B15+B16	;GTJFN FLAGS
	CALL $INFG		;INPUT FILE GROUP
	 JRST CERR
	CONFIRM
	HRRZI F,FDBARC+FDBNAR+AFDBDL
	JRST ARCH1		;GO DO IT


; "ARCHIVE STATUS ..."

ARC.ST:	NOISE <of files>
	MOVE A,[[ASCIZ /*/],,[ASCIZ /*/]]	;DEFAULT NAME AND EXT
	MOVE B,[-3,,B2+B8+B11+B15+B16]	;* VERSION, IGNORE DELETED
	CALL SPECFN
	 JRST CERR
	CONFIRM
	MOVSI F,(1B0)
	JRST ARCH1
>
;ARCSTR $ARC ..ARDF ..ARDL

REPEAT 0,<

ARCSTR:	TLNE Z,GROUPF		;IF DOING A GROUP, TYPE NAME
	ETYPE <%1S :>
	MOVE B,[2,,FDBBCK]	;GET REAL STATUS VIA GTFDB
	MOVEI C,C	;C←BITS,,LAST DUMP #; D←1ST AREC #,,2ND ARC #
	CALL $GTFDB
	 ERROR <$GTFDB error>
	HRRZ G,C		;G←LAST DUMP TAPE #
	HRRZ E,D		;E←2ND ARC TAPE #
	HLRZ D,D		;D←1ST ARC TAPE #
	TLNE C,FDBARC
	JRST [	UTYPE [ASCIZ /  Archive /]
		TLNE C,AFDBDL
		UTYPE [ASCIZ /without /]
		TLNN C,AFDBDL
		UTYPE [ASCIZ /and /]
		UTYPE [ASCIZ /deletion pending;/]
		JRST .+1]
	TLNE C,FDBNAR
	UTYPE [ASCIZ /  Archive not allowed;/]
	TLNE C,FDBAAR
ETYPE <
Archived - Dump tape # %7Q, 1st archive tape # %4Q, 2nd archive tape # %5Q>
	TLNN C,377777		;SAY NOTHING IF NOTHING
	UTYPE [ASCIZ /None;/]
	PRINT EOL
	JRST ARCH2

$ARC:	TABLE
	T DEFERRED,ONEWD,..ARDF
	T DELETE,ONEWD,..ARDL
	T DON'T,,..ARDN
	T IMMEDIATE,ONEWD,..ARCIMMED
	TEND

..ARDF:	;DEFERRED DEFAULTS TO AND DELETE, FALL INTO IT

	;SET ARCHIVE, RESET DON'T DELETE AND DON'T ARCHIVE
..ARDL:	JUMPL F,STATER		;CAN'T MIX STAT
	MOVE F,[FDBARC,,FDBARC+FDBNAR+AFDBDL]
	RET
>
;..ARDN $DONT ...DAR ...DDL STATER

REPEAT 0,<

..ARDN:	JUMPL F,STATER		;CAN'T MIX STAT
	KEYWD $DONT
	0			;NO DEFAULT
	JRST CERR		;NULL ILLEGAL
	CONFIRM
	JRST (KWV)

$DONT:	TABLE
	T ARCHIVE,ONEWD,...DAR	;DON'T ARCHIVE
	T DELETE,ONEWD,...DDL	;DON'T DELETE (IF ARCHIVED)
	TEND

	;RESET ARCHIVE, SET DON'T ARCHIVE
...DAR:	JUMPL F,STATER	;CAN'T MIX STAT
	TLO F,FDBNAR		;GOING TO SET DON'T ARCHIVE
	TLZ F,FDBARC		;GOING TO RESET ARCHIVE REQUEST
	TRO F,FDBARC+FDBNAR	;YUP
	RET

	;DON'T DELETE MEANS SET ARCHIVE AND DON'T DEL, RESET DON'T ARCH.
...DDL:	TRO F,AFDBDL		;DON'T DELETE AFTER ARCHIVING
	TLO F,AFDBDL
	RET

..ARCIMMED:	JUMPL F,STATER	;CAN'T MIX STAT
	;WOULD MARK ARCHIVED BIT HERE ?? (UGH - NOT YET ON TAPE)
	JRST NIYE		;IMMEDIATE NOT IMPLEMENTED YET
>

STATER:	ERROR <Status subcommand cannot be mixed with other subcommands>
;.QFD .QD .QW .QR


;QFD
;QUICK FILE DESCRIPTION
;INTENDED TYPICAL USE IS "QFD <FILE NAME>" WHICH GIVES AN "EVERYTHING"
; DIRECTORY PRINTOUT FOR THE SINGLE FILE, WITHOUT EXCESS SPACES OR HEADG
;BUT IMPLEMENTATION IS LIKE "DIR" PLUS SUBCOMMANDS
; CRAM, EVERYTHING, AND NO (HEADING);
; THUS ADDITIONAL SUBCOMMANDS AND DIFFERENT ARGUMENTS (INCLUDING NONE)
; ARE POSSIBLE.

.QFD:	MOVE E,[001110,,065241]
	HRLZI F,B10	;SAY QFD MODE - ONLY DIR PART OF HEADING PRINTS
	JRST DIR0

.QD:	MOVE E,[001110,,065241]
	HRLZI F,B10+B17
	JRST DIR0		; THESE ARE HPPS GOODIES

.QW:	MOVE E,[001110,,065301]
	HRLZI F,B10
	HRRI Z,1B31+1B35
	JRST DIR0

.QR:	MOVE E,[001110,,065301]
	HRLZI F,B10
	HRRI Z,1B32+1B35
	JRST DIR0
;.DIREC DIR0

;DIRECTORY.

;CAN TAKE AN ARGUMENT SPECIFYING DIRECTORY OR FILES TO LIST.
;CAN BE TERMINATED WITH COMMA TO INITIATE SUBCOMMAND INPUT.

;AC USE
;  E  FIELDS-TO-PRINT INFO A LA JFNS JSYS CALL.
;	ALSO: B26: PRINT LENGTH IN BYTES
;	      B27: CREATE TIME (IMPLIES CREATE DATE)
;	      B28: WRITE TIME (IMPLIES WRITE DATE)
;	      B29: READ DATE (IMPLIES READ TIME)
;	      B30: PRINT AUTHOR (WRITER)
;	      B32: SUPPRESS COLUMNATION (CRAM)
;  F  FLAGS FOR FORMAT, ETC:
;	B10	QFD, ONLY DIR PART OF HEADING PRINTS
;	B11	USE 10/50 FORMAT FOR DECTAPE DIRS
;	B12	NOW PRINTING A DECTAPE, NOT DISK
;	B13	SUPPRESS HEADING
;	B14	SUPPRESS MULTIPLE VERSIONS ON SAME LINE
;	B15	SUPPRESS OMISSION OF NAME, EXT WHEN SAME AS ABOVE
;		(NOTHING SETS B15 (5/20/70/)).
;	B16	DOUBLE SPACE
;	B17     DELETED FILES ONLY
;  RH Z: FLAGS FOR ORDER OF PRINTOUT:
;	B31=20	CHRONOLOGICAL BY WRITE DATE
;	B32=10	CHRON READ
;	B33=4	CHRON CREATION
;	B34=2	ALPHABETIC
;	B35=1	INVERSE ALPHABETIC OR CHRONOLOGICAL
;  LH Z:
;	F1:	ON IF LIST ACCESS VIOLATION(S)
;	F2:	ON IF MORE FILES TO LIST FOR THIS IFH
;	F3:	ON IF MORE THAN ONE ARGUMENT IN LIST

.DIREC:	MOVE E,[001110040001]	;DEFAULT FORMAT: NAME.EXT;VERS;T
	SETZ F,			;DEFAULT: NO SPECIAL FORMAT

;"QFD" JOINS HERE

DIR0:	MOVE A,['E DIR ']
	SETNM
	MOVE A,COJFN		;DEFAULT OUTPUT TO PRI FILE
	MOVEM A,OUTDSG		;NB: RH OF Z IS 0

;DECODE ARGUMENT LIST WITH SUBROUTINE "DIRARG" IN SUBRS.MAC.
;THIS INPUTS A FILE GROUP (NAMES WITH "*" ALLOWED,
;MULTIPLE NAMES ALLOWED, -2 RETURNED FOR EACH EMPTY DIR).
;DEFAULTS NOTHING TO WHOLE CONNECTED DIRECTORY;
;INTERPRETS COMMA OR EOL TERMINATOR TO THE
;WORD "DIRECTORY".
	CALL DIRARG
	JRST [	CONFIRM		;R1: LIST ENDED WITH COMMA
		SUBCOM $DIR	;INPUT SUBCOMMANDS FROM TABLE $DIR
		JRST .+2]
	CONFIRM
;DIRFL DDIR

;EXECUTE "DIRECTORY"

	MOVE A,OUTDSG		;OUTJFN
	MOVEI B,1B20		;WRITE.
	CALL $OPEN7		;OPEN, 7 BIT BYTES, MODE 0.

	MOVE A,INIFH1		;PTR TO FIRST JFN IN BUFFER
	CAMGE A,INIFH2		;PTR TO LAST
	TLO Z,F3		;SET FLAG IF MORE THAN 1 JFN
	SETOM OLDDIR		;IMPOSSIBLE DIRECTORY NUMBER

;COME BACK HERE TO PROCESS NEXT ARGUMENT IN LIST

DIRFL:	CALL UNMDIR		;UNMAP DIR'TORY BUF PAGES, THUS 0ING THEM
	TLZ Z,F2
	MOVE A,OUTDSG
	HRROI B,[ASCIZ /
/]
	SETZ C,
	TRNN E,1B32		;SKIP INITIAL CR IN CRAM FORMAT FOR QFD
	SOUT			;BLANK LINE ABOVE DIRECTORY
	HRRZ A,@INIFH1		;JFN
	CAIN A,-2		;TREAT EMPTY DIR AS DISK
	JRST DDIR
	DVCHR
	LDB B,[POINT 9,B,17]	;DEVICE TYPE
	JUMPE B,DDIR		;DISK
	CAIE B,3		;DECTAPE
	 ERROR <Illegal device>
	TLOA F,B12		;DECTAPE. DEV DESIGNATOR IN A.

;DISK
;E,F, AND Z STILL CONTAIN VARIOUS FLAGS (SEE ABOVE)

DDIR:	TLZ F,B12
	CALL DNAME		;TYPE DIRECTORY NAME IF APPROPRIATE
	CALL DSKDIR		;LIST IT

;DONE A DEVICE OR DIRECTORY.
;F2 SET IF MORE FILES FOR THIS JFN.

	TLNE Z,F2
	JRST DIRFL		;DO NEXT ONE FOR THIS JFN (NOW GNJFN'D)

;NEXT ARGUMENT IN LIST
	AOS A,INIFH1		;STEP POINTER INTO JFN BUFFER
	CAMG A,INIFH2		;BEYOND END?
	JRST DIRFL		;NO
	CALL UNMDIR		;UNMAP BUFFERS
	MOVE A,OUTDSG
	MOVEI B,CR
	BOUT			;BLANK LINE AFTER ALL
	MOVEI B,LF
	BOUT
	CALL RLJFNS		;RELEASE JFNS
	JRST CMDIN4		;GO GET NEXT COMMAND
;UNMDIR

;UNMDIR
;SUBROUTINE TO UNMAP PAGES USED AS BUFFERS IN LISTING DIRECTORIES
;CLOBBERS A-D.  ALSO USED IN LIST/TYPE.

UNMDIR:	SETO A,
	MOVE B,[B0,,<BUF1>B44]
	HRLZI C,1
	MOVEI D,767-<BUF1>B44
	PMAP
	AOS B
	SOJGE D,.-2
	RET
;$DIR

;DIRECTORY...

;SUBCOMMAND TABLE

$DIR:	 	TABLE
;;		T ACCOUNT,ONEWD,...ACC
                T ALPHABETIC,ONEWD
		T AUTHOR,ONEWD
                T BEGIN,ONEWD,0
                T CHRONOLOGICAL,EOLOK+LPROK
		T CRAM,ONEWD
		T DATES,EOLOK+LPROK
		T DELETED,EOLOK+LPROK,..DELE
		T DOUBLESPACE,ONEWD
		T EVERYTHING,ONEWD
		T LENGTH,EOLOK+LPROK
		T LPT,EOLOK
		T NO,EOLOK+LPROK,..NO
                T OUTPUT,CONMAN+LPROK
		T PROTECTION,ONEWD,..PROT
		T REVERSE,ONEWD
		T SEPARATE,EOLOK+LPROK
		T SIZE,ONEWD,..SIZE
                T START,ONEWD+INVIS,0
		T TEN50,ONEWD+INVIS,..TEN5
		T TIMES,EOLOK+LPROK
                T VERBOSE,ONEWD
                TEND
;.ALPHA .AUTHO .CHRON $CHRON

;SUB-COMMAND ROUTINES FOR "DIRECTORY" COMMAND

;;	...ACC:	TRO E,1B20
;;		RET

.ALPHA:	TRZ Z,36		;CLEAR ORDER OF PRINTOUT FLAGS
	TRO Z,1B34		;SAY ALPHABETIC
	RET

.AUTHO:	CONFIRM
	TRO E,1B30
	RET


.CHRON:	NOISE <by>
	KEYWD $CHRON
	 T WRITE,EOLOK+LPROK,20	;NULL DEFAULTS TO THIS
	 JRST CERR		;NOT FOUND IN TABLE
	CONFIRM
	TRZ Z,36		;CLR FLAGS RELATED TO ORDER OF PRINTOUT
	ORI Z,(KWV)		;AND OR IN THOSE FROM RESPONSE DECODING
	RET

$CHRON:	TABLE
	T CREATION,EOLOK+LPROK,4
	T READ,EOLOK+LPROK,10
	T WRITE,EOLOK+LPROK,20
	TEND
;.CRAM .DATES DATES1 .TIMES $DATE ..DELE .DOUBL .EVERY .LENGT

;DIRECTORY SUB-COMMANDS...

.CRAM:	TRO E,1B32
	RET

.DATES:	NOISE <of>
	TLZ Z,F1
DATES1:	KEYWD $DATE		;"TIMES" JOINS HERE
	 T WRITE,EOLOK,1B24
	 JRST CERR
	CONFIRM
	MOVEI KWV,(KWV)
	TLNE Z,F1
	LSH KWV,-4		;TIME ARE 4 BITS TO LEFT OF DATE BITS
	IORI E,(KWV)		;UPDATES JFNS OPTIONS FROM TABLE
	RET

.TIMES:	NOISE <and dates of>
	TLO Z,F1
	JRST DATES1

$DATE:	TABLE
	T CREATION,EOLOK,1B23
	T READ,EOLOK,1B25
	T WRITE,EOLOK,1B24
	TEND

..DELE:	NOISE <files only>
	CONFIRM
	TLO F,1			;SAY DELETED FILES ONLY
	RET

.DOUBL:	TLO F,2			;SAY DOUBLE SPACE
	RET

.EVERY:	IOR E,[001111,,077741]	;ALL FIELDS THAT CAN BE PRINTED
	RET			;THIS IS TOO MUCH TO FIT ONE TTY LINE.

.LENGT:	NOISE <in bytes>
	CONFIRM
	TRO E,1B26		;SAY PRINT LENGTH IN BYTES
	RET
;.LPT $LPT $GTJFN LPT5 .OUTPU ..NO ..PROT .REVER .SEPAR ..SIZE ..TEN5 .VERBO

;DIRECTORY SUB-COMMANDS...

;"LPT" IS SHORT FOR "OUTPUT (TO) LPT:"

.LPT:	CONFIRM
;"LIST" CALLS "$LPT" AS A SUBROUTINE TO ASSIGN A JFN TO LPT.

$LPT:	MOVE B,[POINT 7,[ASCIZ /LPT:/],-1]
;"EDDT" CALLS $GTJFN WITH TEXT POINTER IN B.

$GTJFN:	HLRZ A,JBUFP		;CHECK FIRST FOR JFN STACK SPACE
	CAIN A,-1		;WOULD PDL OV OCCUR AT NEXT PUSH?
	ERROR <Too many JFN's in command>;	YES.
	HRLZI A,B2+B17		;OLD FILES ONLY, SHORT GTJFN CALL.
	GTJFN
	 CALL JERR
	MOVE B,JBUFP
	PUSH B,A
	MOVEM B,JBUFP
LPT5:	MOVEM A,OUTDSG		;JFN.
	RET

.OUTPU:	NOISE <to file>
	MOVE A,[[ASCIZ /DIR/],,[ASCIZ /DIR/]] ;DEFAULT NAME & EXT
	CALL COUTFN
	 JRST CERR
	CONFIRM
	JRST LPT5

..NO:	NOISE (heading)
	CONFIRM
	TLO F,B13
	RET

..PROT:	TLO E,1			;SAY PRINT PROTECTION
	RET

.REVER:	TRO Z,1			;SAY LIST IN REVERSE ORDER
	RET

.SEPAR:	NOISE (lines for each version)	;MAINLY A DEBUGGING CMD
	CONFIRM
	TLO F,B14+B15
	RET
..SIZE:	TRO E,1B22
	RET

..TEN5:	TLO F,B11
	RET

;TIMES: SEE PREVIOUS PAGE

.VERBO:	IOR E,[001111,,066041] 	;ALL BUT CREATION DATE, LEN. IN BYTES,
	RET			;TIMES.  FITS ON ONE TTY LINE.
;DHEAD DHEADX DHEADZ

;DHEAD
;TYPE HEADING, IF ANY, FOR DISK FILE DIRECTORY PRINTOUT.
;THIS ROUTINE MUST BE CHANGED WHENEVER DFILE'S FORMAT IS CHANGED!
;TAKES:	OUTDSG: OUTJFN
;	E: FIELDS TO PRINT BITS
;	F: B13 TO SUPPRESS HEADING

DHEAD:	PUSH P,A
	MOVE A,DIRNO
	CAMN A,OLDDIR
	JRST DHEADZ		;NO CHANGE, FORGET HEADING
	MOVEM A,OLDDIR
	TLNN F,B10+B12+B13	;"QFD","SUPP. HEAD." OR "DTA" FLAG ON?
	TRNN E,777B30		;NOTHING TO LIST AFTER ACCT FIELD?
	 JRST DHEADZ		;YES,NON-VERBOSE LISTINGS GET NO HEADING
	PUSH P,B
	PUSH P,C
	MOVE A,OUTDSG
	CALL DINDNT		;INDENT RIGHT AMT. FOR FIELDS TO PRINT
;PRINT HEADERS FOR THE COLUMNS TO BE INCLUDED IN THIS LISTING
	SETZ C,
	HRROI B,[ASCIZ /Pgs  /]
	TRNE E,1B22		;SIZE IN PAGES
	SOUT
	HRROI B,[ASCIZ /Bytes(sz) /]
	TRNE E,1B26		;SIZE IN BYTES
	CALL DHSOUT
	HRROI B,[ASCIZ /Creation /]
	TRNE E,1B23+1B27	;CREATION DATE
	CALL DHSOUT
	HRROI B,[ASCIZ /        /]
	TRNE E,1B27		;CREATION TIME
	CALL DHSOUT
	HRROI B,[ASCIZ /Write    /]
	TRNE E,1B24+1B28
	CALL DHSOUT
	HRROI B,[ASCIZ /        /]
	TRNE E,1B28
	CALL DHSOUT
	HRROI B,[ASCIZ /Read     /]
	TRNE E,1B25+1B29
	CALL DHSOUT
	HRROI B,[ASCIZ /        /]
	TRNE E,1B29
	CALL DHSOUT
	HRROI B,[ASCIZ /Author/]
	TRNE E,1B30
	SOUT
	HRROI B,[ASCIZ /

/]
	SOUT
DHEADX:	POP P,C
	POP P,B
DHEADZ:	POP P,A
	RET
;DINDNT DHSOUT

;DINDNT: SUBR TO INDENT THE RIGHT AMOUNT BEFORE HEADING,
; AS A FUNCTION OF FIELDS TO BE PRINTED.
;ALSO USED BY DFREST WHEN GOING TO A NEW LINE.

DINDNT:	MOVEI B,TAB
	BOUT			;NAME, EXT, VERSION CROSS FIRST TAB STOP
	TLNE E,<3B17>B53	;PROTECTION, IF REQUESTED IN PRINTOUT,
	BOUT			;CROSSES ANOTHER TAB STOP.
	TRNE E,3B20		;ACCT CROSSES ANOTHER.
	BOUT
	TRNN E,1B32		;UNLESS COLUMNATION SUPPRESSED,
	BOUT			;FOLLOWING FIELDS BEGIN AT NEXT TAB STOP
	RET

;DHSOUT: SOUT AND APPEND SPACE UNLESS COLUMNATION SUPPPRESSED (E B32 ON)
;FOR "DHEAD". CLOBBERS B.

DHSOUT:	SOUT
	MOVEI B," "
	TRNN E,1B32
	BOUT
	RET
;DNAME DNAME4 DNAME5 DNAME6 DNAME8 DNAMEX

;DNAME
;SUBROUTINE TO TYPE DIRECTORY NAME IF "*" GIVEN
;FOR DIRECTORY OR IF MORE THAN ONE ARGUMENT
;IN LIST OR IF OUTPUT NOT TO TERMINAL.

DNAME:	TLNE F,B13
	RET			;HEADING SUPPRESSED
	PUSH P,A
	PUSH P,B
	PUSH P,C
	MOVE A,OUTDSG		;DESTINATION
	MOVE C,@INIFH1		;JFN OF CURRENT ARG
	CAMN C,[-2]		;FOR EMPTY DIR TYPE NOTHING
	JRST DNAMEX		;RETURN
	MOVE A,CSBUFP		;JFNS TO STRING BUFFER
	MOVE B,OUTDSG		;OUTPUT JFN
	CAME B,COJFN		;GOING TO OTHER THAN PRIMARY?
	 CALL SITEO		;OUTPUT SITE
	MOVEI B,(C)
	MOVE C,[2B2+1B5+1B35]	;DEFAULT DEV, PRINT DIR
	TLNE F,B12
	MOVE C,[2B2+1B35]	;DECTAPE: DEVICE ONLY
	MOVE D,A		;SAVE BEG OF DIRECTORY NAME FOR BELOW
	JFNS
	CAMN A,CSBUFP
	JRST DNAMEX		;NULL STRING, PRINT NOTHING
DNAME4:	MOVE 2,OUTDSG
	CAMN 2,COJFN		;GOING TO PRIMARY OUTJFN ?
	 JRST DNAME5		;YES, NO DATE AND TIME
	PUSH P,A		;SAVE PTR INTO CSBUF
	HRROI 2,[ASCIZ /   /]	;THREE SPACES
	SETZM 3
	SOUT
	SETOM 2
	ODTIM			;AND THE TIME
	POP P,A			;RESTORE PTR TO END OF DIR NAME
DNAME5:	TLNE F,B12
	 JRST [	SETOM OLDDIR	;DTA:  BESURE HEADING, ETC WILL PRINT
		JRST DNAME8]
DNAME6:	SETZM B
	DPB B,A			;FLUSH THE CLOSING LESS THAN SIGN
	PUSH P,A	
	SETZM A
	MOVE B,D		;PTR TO BEGINNING OF DIRECTORY
	IBP B			;PASS THE OPENING GREATER THAN SIGN
	STDIR
	 JFCL			;NO MATCH (CAN'T HAPPEN)
	 JFCL			;AMBIGUOUS (CAN'T HAPPEN)
	POP P,B
	MOVEI C,">"
	DPB C,B			;PUT IT BACK
	HRRZS A
	MOVEM A,DIRNO		;REMEMBER DIRECTORY NUMBER
	CAMN A,OLDDIR
	JRST DNAMEX		;NO CHANGE, DON'T PRINT AGAIN
DNAME8:	MOVE A,OUTDSG
	SETZ C,
	HRROI B,[ASCIZ /   /]
	SOUT			;INDENT FOR DIR NAME
	MOVE B,CSBUFP
	SOUT
	HRROI B,[ASCIZ /
/]
	SOUT
DNAMEX:	POP P,C
	POP P,B
	POP P,A
	RET
;$GTFDB FDBILI

;$GTFDB
;SUBROUTINE TO DO GTFDB JSYS AND SKIP UNLESS
;AN INSTRUCTION TRAP WITH "LIST ACCESS NOT ALLOWED"
;ERROR OCCURED.
;USED IN DIRECTORY, UNDELETE, DSKSTAT, COPY/APPEND, LIST/TYPE.
;SHOULD BE IN SAME PAGE AS DSKDIR CAUSE ITS IN A LOOP THERE.

$GTFDB:	PUSH P, A
	MOVEI A,FDBILI		;WHERE TO GO ON INST TRAP
	MOVEM A, ILIDSP
	POP P,A
	GTFDB
	SETZM ILIDSP		;CLEAR SPECIAL INST TRAP DISPATCH
	AOS (P)
	RET

;TRAP OCCURRED, CHECK ERROR CODE

FDBILI:	PUSH P,A
	HRRZ A,ERCOD
	CAIE A,GFDBX3		;"LIST ACCESS NOT ALLOWED"?
	JRST [	POP P,A
		JRST ILIPSI]	;NO,TREAT AS OTHER ILL INST TRAPS.
	JRST [	POP P,A
		RET]
;DSKDIR

;DSKDIR
;SUBROUTINE TO LIST DISK OR DECTAPE DIRECTORY
;READS (WITH GNJFN),SORTS,PRINTS ONE DIRECTORY
;TAKES:	A: SOURCE DEVICE DESIGNATOR FOR DECTAPE
;	OUTDSG: DESTINATION JFN
;	INIFH1:	POINTER TO INDEXABLE FILE HANDLE
;	Z,E,F:	VARIOUS FLAGS, SEE COMMENTS AT
;		BEGINNING OF "DIRECTORY", INCL F B12 FOR DECTAPE.
;RETURNS F2 SET IF ADDITIONAL FILES ARE TO BE LISTED
;	FOR CURRENT INDEXABLE FILE HANDLE.
;CLOBBERS A-D,G-GG.

;BUFFER DEFINITIONS

DTADRC==BUF1			;WHERE DECTAPE DIRECTORY IS READ
DTATBL==BUF1+200		;TABLE FOR DECTAPE FILE LENGTHS
TABLE=BUF2			;WHERE SYMBOL TABLE IS BUILT
TABLEN==777			;LENGTH OF TABLE. CANNOT
				;BE GREATER THAN 511.
DIRBUF=TABLE+TABLEN		;BOTTOM OF STRING AND FDB STORAGE

;SUCCESSIVE PAGES UPWARD FROM BUF1 ARE USED.
;THERE ARE ENOUGH PAGES BELOW DDT AS LONG
;AS DIRECTORY LENGTH REMAINS LIMITED TO 4K.

DSKDIR:	TLNN F,B12		;DECTAPE?
	JRST DSKD2		;NO
	TLNE F,B11		;TEN50 FORMAT REQUESTED?
	JRST OLDTAD		;YES, USE OLD ROUTINE.
	TRNN Z,36		;ORDERING SPECIFIED?
	TRO Z,1B34		;NO, DEFAULT TO ALPHABETIC
;DSKD2

;DSKDIR...
;DECTAPE SPECIFIC PROCESSING.

;FORMAT OF THE DIRECTORY BLOCK ON DECTAPE:
; WORDS 0-82: 5-BIT "SLOTS", 1 PER BLOCK: 0 FREE,
;					  1-22 FILE NUMBER
;					  27 DIRECTORY & TENDUMP BLOCKS
; WORDS 83-104: NAMES OF FILES 1-22
; WORDS 105-126: LH: EXT. B24-35: WRITE DATE.

;READ DIRECTORY
	MOVEI B,DTADRC		;WHERE TO READ IT. DEV DESIG STILL IN A.
	RDDIR			;READ IT
	 CALL [	CAIN A,RDDIX1
		UERR [ASCIZ /Trouble reading directory,
 maybe DECtape not on "remote"/]
		JRST JERR]

;SCAN "SLOTS" PORTION OF DIRECTORY, COUNTING BLOCKS IN FILES
	MOVE B,[POINT 5,DTADRC,-1]	;5 BITS PER BLOCK ON TAPE
	MOVEI C,↑D578		;# BLOCKS ON TAPE
	ILDB D,B		;FETCH A SLOT BYTE
	AOS DTATBL(D)		;INDEX APPROPRIATE TABLE WORD
	SOJG C,.-2

;TYPE # FREE BLOCKS
;SUPPRESS IF NOT LISTING WHOLE DIRECTORY ??
	TRNE E,1B32
	JRST DSKD2		;OMIT IN CRAM FORMAT (QFD)
	MOVE A,OUTDSG
	HRROI B,[ASCIZ /
/]
	SETZ C,
	TLNE F,B16
	SOUT			;EXTRA CRLF IF DOUBLE-SPACING
	MOVEI B," "
	BOUT
	MOVE B,DTATBL+0
	MOVEI C,↑D10
	NOUT
	 CALL JERRC
	HRROI B,[ASCIZ / free blocks
/]
	SETZ C,
	SOUT
DSKD2:	CALL DHEAD		;PRINT COLUMN HEADS IF APPROPRIATE
	MOVE A,OUTDSG
	HRROI B,[ASCIZ /
/]
	SETZ C,
	TLNE F,B16
	SOUT			;EXTRA CRLF IF DOUBLE-SPACING
;DSKR1

;DSKDIR ...
;READ FDB, NAME, EXT OF EACH FILE TO LIST,
;LOOPING OVER FILES WITH GNJFN, STOPPING IF DEVICE OR
;DIRECTORY CHANGES.
;IN FDB PUT POINTERS TO NAME, EXT, AND ACCT STRINGS.
;FOR DECTAPE FILES A DUMMY FDB CONTAINING NAME, EXT, WRITE DATE,
;  # BLOCKS, AND THE REST 0 IS BUILT
;FORM TABLE OF POINTERS TO FDB'S STARTING AT "TABLE".
;LH OF EACH POINTER WORDS HAS 9-BIT REVERSE AND
;FORWARD LIST POINTERS TO PERMIT SORTING IN PLACE
;AND LISTING IN FORWARD OR REVERSE ORDER.
;WORD TABLE +0 IS A DUMMY, WITH FORWARD POINTER
;TO HEAD OF LIST, REVERSE POINTER TO END, AND
;0 RH TO TERMINATE SORT AND PRINT OPERATIONS.
;FIRST ENTRY IN LIST HAS 0 REV PTR, LAST HAS 0 FWD PTR.

	MOVEI GG,0		;INITIALIZE TABLE INDEX
	MOVEI C,DIRBUF		;INITIALIZE BUFFER SPACE POINTER
	MOVE A,@INIFH1
	CAMN A,[-2]		;IS IT A COMPLETELY EMPTY DIRECTORY ?
	JRST DSKR9		;YES.
;TOP OF LOOP

;CHECK FOR TABLE FULL, IF SO PRINT MULTIPLE PARTIAL DIRECTORIES

DSKR1:	CAIG C,767720
	CAIL GG,TABLEN-2	;BOTH ENDS MUST HAVE 0'S
	JRST [	UTYPE [ASCIZ / Storage full,
 Directory will be printed in two sections
/]
		JRST DSKR8]	;GO SET F2, LIST THIS MUCH.
;DSKR2

;DSKDIR... READ...
;READ AND STORE FDB AND STRINGS FOR A FILE
	TLNE F,B12
	JRST DSKR2		;FOR DTA LEAVE A 0 BLOCK FOR "FDB"
	HRRZ A,@INIFH1		;JFN
	MOVE B,[16,,0]		;FDB THRU "FDBCRV"
				;C ALREADY SET RIGHT
	CALL $GTFDB		;DO GTFDB JSYS AND SKIP UNLESS(β⊂∞.
	JRST [	TLO Z,F1	;LIST ACCESS NOT ALLOWED
		JRST DSKR7]	;FLAG INVOKES MSG LATER
	MOVE A,FDBCTL(C)	;CONTROL BITS WORD OF FDB
	TLNE F,B17		;"DELETED FILES ONLY" REQUESTED?
	TLC A,<FDBDEL>B53	;YES,COMPLEMENT "DELETED" BIT
	TLNE A,<FDBDEL>B53	;THIS FILE DELETED OR NOT AS REQUESTED?
	JRST DSKR7		;NO SKIP IT.
DSKR2:	MOVE D,C		;WHERE THIS FDB IS
	HRROI A,16(D)		;CREATE STRING POINTER PAST FDB
	HRRM A,FDBCTL(D)	;NAME POINTER TO FDB
	HRRZ B,@INIFH1		;JFN
	HRLZI C,B8		;FORMAT
	JFNS			;GET NAME STRING
	HRROI A,2(A)		;STRING PTR TO BEG OF NEXT WORD TO USE
				;LEAVES A 0 WORD TO TERMINATE
				;STRING FOR SORT.
	HRLM A,FDBEXT(D)	;EXT PTR TO FDB
	HRLZI C,B11
	JFNS			;EXTENSION STRING
;;	MOVE B,FDBACT(D)	;ACCOUNT
;;	JUMPLE B,DSKR4		;NUMERIC OR MISSING
;;	HRROI A,2(A)
;;	HRRZM A,FDBACT(D)
;;	HRRZ B,@INIFH1
;;	MOVEI C,1B20
;;	JFNS			;GET ACCOUNT STRING
;DSKR4 DTADRN DTADRE DTADR1 DTADR9

DSKR4:	MOVEI C,2(A)		;WHERE TO STORE NEXT FDB
				;AGAIN LEAVING A 0 WORD POINTER
	TLNN F,B12
	JRST DSKR5
;FOR DTA PICK UP DATE AND SIZE
;SEARCH DIRECTORY TO GET DATE (IN SAME WORD AS EXT)
;AND SIZE (AT SAME INDEX INTO DTATBL).
	HRLZI AA,-↑D22

;CONVERT NAME AND EXT FROM "FDB" TO SIXBIT IN BB, CC.
;CLOBBERS BB-FF.
	HRLI EE,<POINT 7,0,-1>B53	;NAME
	HRR EE,FDBCTL(D)
	MOVEI FF,6
DTADRN:	ILDB CC,EE		;NAME CHAR LOOP
	JUMPE CC,.+2
	SUBI CC,40
	LSH CC,36
	LSHC BB,6
	SOJG FF,DTADRN
	HRLI EE,<POINT 7,0,-1>B53	;EXTENSION
	HLR EE,FDBEXT(D)
	MOVEI FF,3
DTADRE:	ILDB DD,EE		;EXT CHAR LOOP
	JUMPE DD,.+2
	SUBI DD,40
	LSH DD,36
	LSHC CC,6		;EXT ENDS UP IN RH CC, GARBAGE IN LH.
	SOJG FF,DTADRE
DTADR1:	CAME BB,DTADRC+↑D83(AA)
	JRST DTADR9		;WRONG NAME
	HRLZ B,CC		;EXT,,0 FROM "FDB"
	XOR B,DTADRC+↑D105(AA)	;COMPARE EXT, PICK UP DATE FROM DTADRC
	PUSH P,C
	ANDCMI B,7B23
	MOVEI C,1B35		;NEW DEC DATE STANDARD
	TDNE C,DTADRC+0(AA)	;PICK UP THREE EXTRA BITS
	 TRO B,1B23
	TDNE C,DTADRC+↑D22(AA)
	 TRO B,1B22
	TDNE C,DTADRC+↑D44(AA)
	 TRO B,1B21
	POP P,C
	TLNE B,-1
	JRST DTADR9		;WRONG EXT
	DPB B,[POINT 15,FDBWRT(D),35]	;DATE TO "FDB"
	MOVE B,DTATBL+1(AA)
	HRRM B,FDBBYV(D)	;SIZE IN BLOCKS
	JRST .+2
DTADR9:	AOBJN AA,DTADR1		;IF NOT FOUND LEAVE THINGS 0
;DSKR5 DSKR7 DSKR8 DSKR9

;DSKDIR... READ...
;MAKE TABLE ENTRY

DSKR5:	DPB GG,[POINT 9,TABLE+1(GG),8]	;REVERSE POINTER
					;TO ENTRY WE ARE ABOUT TO USE
	MOVEI GG,1(GG)			;INCREMENT TABLE INDEX
	DPB GG,[POINT 9,TABLE-1(GG),17]	;FORWARD POINTER
					;TO PREVIOUS ENTRY
					;LEAVES 0 IN LAST ENTRY.
	HRRM D,TABLE(GG)		;PTR TO FDB TO THIS TABLE ENTRY

;STEP TO NEXT FILE, STOP IF ANOTHER DEVICE OR DIRECTORY

DSKR7:	MOVE A,@INIFH1
	TLNE A,<77B5>B53	;IF NO *-FLAGS SKIP GNJFN
	GNJFN
	 JRST DSKR9		;NO MORE,DONE READING
	TLNN A,70		;DEVICE OR DIRECTORY CHANGED?
	JRST DSKR1		;NO,DO THIS FILE.
DSKR8:	TLO Z,F2		;YES,SAY THERE'S MORE FOR THIS JFN,
				;SORT AND PRINT WHAT WE HAVE
DSKR9:	DPB GG,[POINT 9,TABLE,8];PUT "REVERSE" POINTER
				;TO LAST ENTRY IN DUMMY ENTRY 0.
				;USED FOR REVERSE UNSORTED LISTING.
	TRNN Z,36		;ANY ORDER-OF-PRINTOUT FLAGS ON?
	JRST DSKP		;NO, NO SORT REQUIRED, GO PRINT
;DSKS1 GRATR LESS HERE

;DSKDIR...

;SORT DISK DIRECTORY
;FOR EACH SUCCESSIVE WORD OF UNSORTED TABLE, FIND
;PLACE TO PUT IT IN LIST-STRUCTURED TABLE, STARTING
;FROM LAST INSERTED ENTRY TO MAKE MAXIMUM
;USE OF PARTIAL ORDERING.
;ENDS OF LIST ARE INDICATED BY 0 RH OF TABLE WORD.
;START WITH ZEROED WORD 0; THIS PUTS POINTERS TO IT
;(AS TERMINATING ENTRY) AT EACH END OF LIST.

	SETZM TABLE		;INITIALIZE SORTED TABLE:
				;MAKES LAST FIND AND FIRST REV
				;PTR POINT TO A WORD (NAMELY THIS WORD) 
				;WITH 0 RH.
	MOVEI GG,0		;INDEX OF CURRENT (LAST INSERTED)
				;SORTED TABLE ENTRY
	MOVEI 	;INDEX INTO UNSORTED TABLE

;TOP OF LOOP

DSKS1:	SKIPN TABLE(AA)
	JRST DSKP		;NO MORE TO SORT, GO PRINT
	CALL FDBSC		;COMPARE ENTRY (GG) TO (AA),3 RETURNS
	 JRST LESS		;UNSORTED ENTRY (GG) LESS
	 JRST HERE		;EQUAL

;UNSORTED ENTRY GREATER, SEARCH FORWARD

GRATR:	LDB GG,[POINT 9,TABLE(GG),17]	;GET FWD PTR
	CALL FDBSC		;COMPARE AGAIN
	 JRST .+3		;LESS
	 JRST .+2		;EQUAL OR AT END OF TABLE
	JRST GRATR		;GREATER, KEEP SEARCHING

;LESS OR EQUAL, PUT IT BEFORE THIS ONE

	LDB GG,[POINT 9,TABLE(GG),8]	;BACK UP 1
	JRST HERE		;PUT IT AFTER THIS ONE

;UNSORTED ENTRY LESS, SEARCH BACKWARD

LESS:	LDB GG,[POINT 9,TABLE(GG),8]	;GET REVERSE PTR
	CALL FDBSC
	 JRST LESS		;KEEP SEARCHING
	 JRST HERE		;EQUAL OR BEGINNING OF TABLE

;INSERT ENTRY AFTER CURRENT ENTRY BY UPDATING LIST POINTERS

HERE:	LDB A,[POINT 9,TABLE(GG),17]	;SORTED ENTRY'S FWD PTR
	DPB A,[POINT 9,TABLE(AA),17]	;TO ENTRY BEING INSERTED
	DPB AA,[POINT 9,TABLE(GG),17]	;SET FWD PTR OF
			;SORTED ENTRY TO POINT AT NEW ENTRY
	DPB AA,[POINT 9,TABLE(A),8]	;SET REV PTR OF ENTRY
			;FOLLOWING SORTED ENTRY TO POINT AT NEW ENTRY
	DPB GG,[POINT 9,TABLE(AA),8]	;SET NEW ENTRY'S REV
			;PTR TO POINT PREVIOUS SORTED ENTRY
	MOVE GG,AA	;ENTRY JUST INSERTED IS CURRENT
	AOJA AA,DSKS1	;BOTTOM OF LOOP: NEXT UNSORTED ONE
;FDBSC

;DSKDIR...
;SUBROUTINE FDBSC FOR SORT
;COMPARE FDB'S THAT TABLE ENTRIES SPECIFIED BY INDICES
;IN GG AND AA POINT TO.
;RETURN+1 IF GG LESS, +2 =, +3 GREATER
;ACCORDING TO SORT KEY SPECIFIED BY FLAGS IN RHZ
;RET +2 IF GG POINTS TO NULL TABLE ENTRY.
;CLOBBERS A - D, G, BB.

FDBSC:	HRRZ BB,TABLE(GG)	;BB POINTS TO FIRST FDB
	HRRZ G,TABLE(AA)	;G TO SECOND
	JUMPE BB,FDBEQ		;NULL, RETURN AS THOUGH EQUAL.
	TRNN Z,1B34
	JRST FDBSC2

;ALPHABETIC COMPARISON.

	HRRZ A,FDBCTL(BB)	;NAME PTRS
	HRRZ B,FDBCTL(G)
	CALL FDBSTC		;STRING COMPARE RETURNS HERE
				;ONLY IF EQUAL.

;NAMES =, COMPARE EXTENSIONS

	HLRZ A,FDBEXT(BB)
	HLRZ B,FDBEXT(G)
	CALL FDBSTC

;=, COMPARE VERSIONS

	HLRZ A,FDBVER(BB)
	HLRZ B,FDBVER(G)
	JRST FDBSC3		;JOIN CHRONOLOGICAL CASE FOR COMPARE
;FDBSC2 FDBSC3 FDBGR FDBEQ FDBLS

;DSKDIR SORT SUBR FDBSC...
;FOR EACH CHRONOLOGICAL COMPARISON FETCH THE DATES AND TIMES
;TO COMPARE THEN CONVERGE ON COMPARE

FDBSC2:	TRNN Z,1B31
	JRST .+4
	MOVE A,FDBWRT(BB)	;WRITE
	MOVE B,FDBWRT(G)
	JRST FDBSC3
	TRNN Z,1B32
	JRST .+4
	MOVE A,FDBRED(BB)	;READ
	MOVE B,FDBRED(G)
	JRST FDBSC3
	TRNN Z,1B33
	JRST FDBGR		;NO SORTING SPEC. (IE DIRECTORY ORDER)
				;TREAT AS THO GREATER.  NOTE THAT
				;"REVERSE" STILL WORKS

;THIS IS WHERE TO ADD CASES

	MOVE A,FDBCRV(BB)	;CREATE
	MOVE B,FDBCRV(G)
FDBSC3:	CAMN A,B
	JRST FDBEQ
	CAML A,B		;RETURN "GREATER" IF DATE LESS
	JRST FDBLS		;BECAUSE DEFAULT ORDER IS
	JRST FDBGR		;REVERSE CHRONOLOGICAL
FDBGR:	AOS (P)
FDBEQ:	AOS (P)
FDBLS:	RET
;FDBST1 FDBSTC

;DSKDIR... SORT...
;FDBSTC: STRING COMPARE FOR FDBSC.
;A AND B POINT TO STRING BLOCKS WITH
;HEADER WORD AND 0 WORD AFTER.
;RETURNS IF =, ELSE GOES TO FDBLS OR FDBGR.
;CLOBBERS A-D.

FDBST1:	SKIPN (A)		;WORDS =. END OF STRINGS?
	RET			;YES, STRINGS =.
	MOVEI A,1(A)
	MOVEI B,1(B)

;ENTER HERE

FDBSTC:	JCRY0 .+1
	MOVE C,(A)		;FETCH WORD OF FIRST STRING 
				;PASSING HEADER WORD.
	SUB C,(B)		;SUBTRACT WORD OF 2ND STRING
	JUMPE C,FDBST1		;WORDS =?
	JCRY0 [	SUB P,[1,,1]	;FORGET RETURN
		JRST FDBLS]
	SUB P,[1,,1]
	JRST FDBGR
;DSKP DSKP1 DSKP4 DSKP5

;DSKDIR...
;PRINT DISK DIRECTORY

DSKP:	SETZM LPNAME
	SETZM LPEXT
	SETZM LPFDB

;COPY FLAGS APPROPRIATE TO DEVICE FORM E TO BB
	MOVE BB,E		;ALL FOR DISK
	TLNE F,B12
	AND BB,[7B8+7B11+1B22+1B24+1B28];DECTAPE
	MOVEI GG,0		;GG IS TABLE POINTER
				;WORD TABLE+0 IS A DUMMY,
				;NOT TO BE LISTED
DSKP1:	TRNN Z,1			;SKIP IF REVERSE ORDER
	LDB GG,[POINT 9,TABLE(GG),17]	;FWD POINTER
	TRNE Z,1			;SKIP IF NORMAL ORDER
	LDB GG,[POINT 9,TABLE(GG),8]	;REVERSE PTR
	HRRZ G,TABLE(GG)	;FDB PTR FROM TABLE ENTRY
	JUMPE G,DSKP4		;0 MEANS END
	CALL DFILE		;LIST THIS ENTRY
	JRST DSKP1

DSKP4:	CALL DFREST		;PRINT REST OF LAST LINE
	TLZN Z,F1		;ANY LIST ACCESS ERRORS?
	JRST DSKP5
	TLNN Z,GROUPF
	TYPE < List protect violation
>;			FOR A SINGLE FILE
	TLNE Z,GROUPF
	TYPE < Plus file(s) that are list protected from you
>;
DSKP5:	RET			;RETURN FROM DSKDIR
;DFILE
;LIST ONE FILE
;TAKES: OUTDSG: OUTPUT JFN
;	BB: WHAT FIELDS TO PRINT BITS -- SAME AS JFNS'S EXCEPT
;	   COMBINATIONS NOT PRODUCED BY "DIRECTORY" COMMAND AREN'T
;	   NECESSARILY HANDLED.
;	   AND ALSO: B26: PRINT LENGTH IN BYTES.
;		     B27-30: CREATE, WRITE, READ TIMES (IMPLYING DATES)
;		     B32: SUPPRESS COLUMNATION
;	F: B14: DON'T PUT MULTIPLE VERSIONS OF SAME NAME.EXT
;		ON SAME LINE
;	   B15: SUPPRESS THE NORMAL OMISSION OF NAME OR NAME.EXT
;	        WHEN SAME AS THOSE LAST PRINTED
;	   B16: ON FOR DOUBLE-SPACING
;	   B17: ON TO LIST DELETED FILES ONLY
;	G: POINTER TO FDB
;AC USE
;	D: # COLS MIN TO USE FOR CURRENT FIELD / RUNNING NEGATIVE
;	   TOTAL OF PREVIOUS FIELD OVERFLOW COLUMNS (SEE "DFILL").

;CLOBBERS A, B, C, D.
;DFILE DFL02B

;DFILE

DFILE:	MOVE A,OUTDSG
	SETZ D,			;NO FIELDS HAVE EXCEEDED MIN WIDTH YET

;NAME, EXTENSION, VERSION

	HRRZ B,FDBCTL(G)	;NAME
; IF NAME IS SAME AS THAT LAST PRINTED, JUST PRINT 3 SPACES.
	TLNE F,B15
	JRST DFL03A		;FLAG SUPPRESSES COMPACT FORMAT
	SKIPE C,LPNAME		;LAST NAME PRNTD. NONE MEANS "DIFFERENT"
	CALL DCMPR		;COMPARE CURRENT NAME TO LAST PRINTED
	 JRST DFL03A		;DIFFERENT, PRINT IT.
	HLRZ B,FDBEXT(G)
	SKIPE C,LPEXT
	CALL DCMPR		;NAME IS SAME, IS EXT SAME ALSO?
	 JRST [	CALL DFREST	;FINISH PREVIOUS LINE, IF ANY.
		MOVE B,[POINT 7,[ASCIZ / /],-1]   ;NAME SAME, EXT DIFF
		AOJA D,DFL03B]	;PRINT SPACES AND PROCEED TO EXTENSION

;NAME AND EXTENSION ARE THE SAME AS THOSE LAST PRINTED.
;NORMALLY PUT COMMA AND ADDITIONAL VERSION ON SAME LINE UNLESS
; SOME OTHER FIELD TO BE PRINTED IS DIFFERENT,
; BUT IF THAT IS SUPPRESSED OR A FIELD IS DIFFERENT,
; START NEW LINE WITH TAB INSTEAD OF NAME.EXT.

	TLNE F,B14
	JRST DFL02B		;MULTIPLE VERSIONS PER LINE SUPPRESSED

;COMPARE CURRENT FDB TO PREVIOUS, COMPARING ONLY THOSE
; FIELDS WHICH ARE TO BE PRINTED.

	CALL DFDBCM
	 JRST DFL02B		;DIFFERENT, NEW LINE.
	MOVE D,LFPOS		;SAME, RETRIEVE "POSITION" ON THIS LINE
	MOVEI B,","		;USE A COMMA,
	SOJA D,DFL05A		;ACCOUNT COLUMN USED BY COMMA,
				;AND GO PRINT VERSION ON SAME LINE.

;FINISH OLD LINE AND START NEW FOR SAME NAME.EXT

DFL02B:	CALL DFREST		;PRINT REST OF LAST FILE'S INFO, IF ANY
	MOVEI D,↑D8		;8 COLS IF COLUMNATION NOT SUPPRESSED,
	HRROI B,[ASCIZ / /]	;ONE SPACE IF IT IS SUPPRESSED.
	CALL DFILL		;SPACES(S) IN PLACE OF NAME.EXT
	JRST DFL05		;GO PRINT VERSION
;DFL03A DFL03B DFL05 DFL05A

;DFILE...
;PRINT NAME

DFL03A:	CALL DFREST		;PRINT REST OF PREVIOUS LINE, IF ANY
	MOVEI B," "
	BOUT			;SPACE AT BEGINNING OF EACH LINE
	HRRO B,FDBCTL(G)	;NAME BLOCK RELATIVE LOCATION
	HRROM B,LPNAME		;REMEMBER LAST PRINTED NAME
DFL03B:	ADDI D,3		;USE 3 COLUMNS MINIMUM
	CALL DFILL		;PRINT NAME OR SPACES

;PRINT EXTENSION

	HLRO B,FDBEXT(G)	;EXT
	HRROM B,LPEXT		;REMEMBER LAST PRINTED EXTENSION
	PUSH P,B
	MOVEI B,"."		;"." IS NORMAL SEPARATOR
	BOUT
	POP P,B			;EXT PTR AGAIN
	ADDI D,3		;# COLS TO USE: 3 - EXTRAS USED FOR NAME
	CALL DFILL		;OUTPUT EXTENSION

;PRINT FIRST VERSION ON LINE

DFL05:	MOVEI B,";"
DFL05A:	TLNE BB,<1B14>B53	;SUPPRESS FOR DTA
	BOUT			;ADDIT'L VERSION ON SAME LINE JOINS HERE
	HLRZ B,FDBVER(G)	;VERSION
	MOVEI C,↑D10
	TLNE BB,<1B14>B53
	CALL DFNOUT		;NOUT AND KEEP TRACK OF COLS USED.
	MOVEM G,LPFDB		;SAVE FDB ADDRESS FOR "DFREST"
	MOVEM D,LFPOS		;LINE "POSITION" (- # COLS OV) ALSO
	RET

;PRINTING OF ADDITIONAL FIELDS FOR THIS NAME.EXT;VERSION IS DEFERRED
; SO THAT ADDITIONAL VERSION NUMBERS MAY BE PRINTED HERE, 
; SEPARATED BY COMMAS.
;DFREST DFR06A

;DFREST
;LIST REST OF FIELDS AFTER VERSION NUMBER
;CALLED FROM DFILE WHEN A DIFFERENT VERSION NUMBER IS DETECTED,
; AND AT END OF LISTING.
;TAKES:	LPFDB:	ZERO OR POINTER TO FDB FOR WHICH TO FINISH PRINTOUT
;	LFPOS:	- # COLS LINE OVERFLOW, AS REQUIRED FOR "DFILL"
;	OUTDSG,E,F:	AS FOR "DFILE" ABOVE.
;RETURNS: LPFDB 0, B,C CLOBBERED, D-G PRESERVED.

DFREST:	SKIPN LPFDB
	RET			;NOTHING TO PRINT REST OF, RETURN.
	PUSH P,D
	PUSH P,G
	MOVE A,OUTDSG
	MOVE G,LPFDB		;LOCATION OF FDB
	MOVE D,LFPOS		;LINE OVERFLOW SITUATION
	SETZM LPFDB		;MAKE SURE IT ISN'T LISTED AGAIN

;PROTECTION

	TLNN BB,<3B17>B53
	JRST DFR07		;PRINTING PROTECTION NOT REQUESTED
	HRROI B,[ASCIZ /;P/]
	SETZ C,
	SOUT
	HLRZ B,FDBPRT(G)	;LEFT HALF OF PROTECTION WORD
	CAIE B,500000		;500000 MEANS 18-BIT OCTAL IN RH
	JRST DFR06A		;0 MEANS STRING PTR
	HRRZ B,FDBPRT(G)
	MOVEI C,10
	CALL DFNOUT		;NOUT AND KEEP TRACK OF COLUMNS USED
	JRST DFR07
DFR06A:	HRROI B,[ASCIZ /Fancy protection/]
	CALL DFILL		;DFILE WILL HAVE TO BE MODIFIED WHEN
				;HAIRY PROTECTION IS IMPLEMENTED. ←←←←←
;DFR07 DFR08 DFR85

;DFREST...
;ACCOUNT

DFR07:;;	TRNN BB,3B20
	JRST DFR08
;;	HRROI B,[ASCIZ /;A/]
;;	SETZ C,
;;	SOUT
;;	MOVE B,FDBACT(G)
;;	JUMPL B,DFR07A
;STRING ACCOUNT

;;	SKIPN FDBACT(G)		;"NONE" FOR NO BLOCK # OR PTR FOUND
;;	HRROI B,[ASCIZ /None/]
;;	HRROI B,0(B)		;MAKE PROPER LH
;;	CALL DFILL		;PRINT THE STRING
;;	JRST DFR08

;NUMERIC ACCOUNT

;;DFR07A:	TLZ B,700000		;CLEAR HI BITS.
;;		MOVEI C,↑D10		;DECIMAL
;;		CALL DFNOUT		;NOUT AND KEEP TRACK OF CHRS OUTPUT

; ;T: ALWAYS PRINTED IF FILE IS TEMPORARY.
; ;S: ALWAYS PRINTED IF FILE IS SCRATCH

DFR08:	MOVE B,FDBCTL(G)	;CONTROL BITS
	TLNN B,<FDBTMP>B53	;IS FILE TEMP?
	JRST DFR85
	HLRZ C,FDBVER(G)
	CAIGE C,↑D100000	;SCRATCH?
	HRROI B,[ASCIZ /;S/]
	CAIL C,↑D100000
	HRROI B,[ASCIZ /;T/]
	CALL DFILL		;SOUT AND KEEP TRACK OF COLUMNS


; ;E: ALWAYS PRINTED IF FILE IS EPHEMERAL

DFR85:	MOVE B,FDBCTL(G)
	TLNN B,(FDBEPH)
	 JRST DFR09
	HRROI B,[ASCIZ /;E/]
	CALL DFILL		;SOUT AND KEEP TRACK OF COLUMNS IN D
;DFR09 DFR09A DFR09C DFR09D

;DFREST...

DFR09:	TRNN BB,777B30		;ANY TIMES, ETC. TO PRINT?
	JRST DFRXIT		;NO

;BEFORE PRINTING THE REST SPACE OVER TO THE APPROPRIATE TAB STOP,
;OR PRINT ONE SPACE IF BEYOND IT, OR USE A NEW LINE IF TOO FAR BEYOND.

	TRNN BB,1B32		;NEVER AN EOL IF COLUMNATION SUPPRESSED
	CAML D,[-35]		;TO MUCH LINE OVERFLOW?
;-35 WAS CHOSEN BECUASE IT IS ONE CHARACTER SHORT OF PUSHING
;DATES CLEAR INTO NEXT COLUMN WHEN ;A AND ;P ARE PRESENT.
	JRST DFR09A		;OK
	MOVEI B,CR
	BOUT
	MOVEI B,LF
	BOUT
	CALL DINDNT		;INDENT THE RIGHT AMOUNT ON NEW LINE
	SETZ D,			;NO LINE OVERFLOW NOW
	JRST DFR09C
DFR09A:	HRROI B,[ASCIZ / /]	;THE ONE SPACE
	ADDI D,7		;RIGHT # COLS BEYOND MIN FOR NAM.EXT;VER
	TLNE F,B12
	SUBI D,2		;2 COLS NARROWER FOR DECTAPE
	TLNE BB,<3B17>B53
	ADDI D,6		;ANOTHER TAB STOP FOR PROT
	TRNE BB,3B20
	ADDI D,6		;";A" AND ";P NOT COUNTED IND
	CALL DFILL		;SOUT AND ADD SPACES

;SIZE IN PAGES OR DECTAPE BLOCKS

DFR09C:	TRNN BB,1B22
	JRST DFR09D
	HRRZ B,FDBBYV(G)	;SIZE IN PAGES
	MOVEI C,↑D10		;DECIMAL
	CAIGE B,↑D1000		;WILL FIT IN 3 COLS?
	HRLI C,(1B2+3B17)	;YES, RIGHT JUSTIFY IT
	ADDI D,3		;3 COLS MIN WIDTH, LESS PRECEDING OVFLO
	CALL DFNOUT		;NOUT WITH FANCY COLUMNATION
	MOVEI B," "
	BOUT
	BOUT
;LENGTH IN BYTES: PRINT "LENGTH(SIZE)"

DFR09D:	TRNN BB,1B26
	JRST DFR10
	MOVE B,FDBSIZ(G)
	MOVEI C,↑D10		;DECIMAL
	CALL DFNOUT		;NO COLUMNATION YET
	MOVEI B,"("
	BOUT
	LDB B,[POINT 6,FDBBYV(G),11]	;BYTE SIZE
	MOVEI C,↑D10
	CALL DFNOUT
	MOVEI B,")"
	BOUT
	HRROI B,[ASCIZ / /] ;NOW A SEPARATING SPACE, PLUS ENOUGH MORE
	ADDI D,↑D9		;SO "SIZE(LENGTH)" TAKES UP 10 COLS,
	CALL DFILL		;( 10 - ()'S+" "=9)
				;LESS EXCESS USED BY NAME.
;DFR10 DFR11 DFR12 DFR129 DFR13 DFRXIT

;DFREST...
;THE VARIOUS DATES AND TIMES

DFR10:	SETZ C,			;FORMAT: DD-MMM-YY HH:MM:SS
	TRNE BB,1B32		;SUPPRESS COLUMNATION?
	TLO C,B17		;SUPPRESS COLUMNATION.
	TRNN BB,1B23+1B27
	JRST DFR11
	TRNN BB,1B27		;TIME TO BE INCLUDED?
	TLO C,B9		;NO, EXCLUDE IT
	MOVE B,FDBCRV(G)	;VERSION CREATION DATE & TIME
	ODTIM			;PRINT DATE AND MAYBE TIME.
	MOVEI B," "
	BOUT
DFR11:	TRNN BB,1B24+1B28
	JRST DFR12
	TLZ C,B9
	TRNN BB,1B28
	TLO C,B9
	MOVE B,FDBWRT(G)	;WRITE DATE
	TLNE F,B12
	JRST [	CALL DTADAT	;PRINT DECTAPE FORMAT DATE
		JRST DFR12]
	ODTIM
	MOVEI B," "
	BOUT
DFR12:	TRNN BB,1B25+1B29
	JRST DFR129
	SKIPN B,FDBRED(G)
	 JRST [	HRROI B,[ASCIZ / Not read/]
		MOVEI C,0
		SOUT
		TRNE BB,1B29	;TIMES BEING PRINTED...
		TRNE E,1B32	;AND NOT IN CRAM MODE?
		 JRST DFR129	;NOT SO.
		HRROI B,[ASCIZ /         /]
		SOUT		;YES
		JRST DFR129]
	TLZ C,B9
	TRNN BB,1B29
	TLO C,B9
	ODTIM
DFR129:	TRNE E,1B30		;GOING TO PRINT AUTHOR?
	TLNE F,(1B12)		;AND NOT DECTAPE
	 JRST DFRXIT		;NO.
	MOVEI B," "		;YES, PRINT A SPACE
	BOUT

DFR13:	HLRZ B,FDBUSE(G)	;DIR NUM OF WRITER
	MOVEI C,10
	DIRST
	 NOUT
	  JFCL

;CRLF AND EXIT

DFRXIT:	HRROI B,[ASCIZ /
/]
	SETZ C,
	SOUT
	HRROI B,[ASCIZ /
/]
	TLNE F,2		;DOUBLE-SPACE?
	SOUT			;YES, ANOTHER EOL.
	POP P,G
	POP P,D
	RET
;DTADAT

;SUBROUTINE DTADAT: PRINTS DECTAPE FORMAT DATE FROM B.
;USED IN DFREST, OLDTAD.
;TAKES: A: DESTINATION, B: DATE. CLOBBERS C,D.

DTADAT:	PUSH P,E
	MOVE D,B
	IDIVI D,↑D31
	HRLZ C,E		;DAY OF MONTH
	IDIVI D,↑D12
	HRR B,E			;MONTH
	HRLI B,↑D1964(D) 	;YEAR
	HRLZI E,B9		;SUPPRESS TIME
	ODTNC		;OUTPUT DATE WITHOUT CONVERSION FROM INTERNAL
	POP P,E
	RET
;DCMPR DCMPR1 DCMPR9

;DCMPR: SUBOUTINE FOR DFILE.
;COMPARE STRING C POINTS TO TO STRING B POINTS TO.
;SKIP IF EITHER POINTER IS ZERO OR IF STRINGS ARE SAME.

DCMPR:	JUMPE C,[AOS (P)
		RET]
	JUMPE B,[AOS (P)
		RET]
	PUSH P,B
	PUSH P,C
	PUSH P,D
	PUSH P,E
	HRLI B,<POINT 7,0,-1>B53
	HRLI C,<POINT 7,0,-1>B53
DCMPR1:	ILDB E,C
	ILDB D,B
	CAME E,D
	JRST DCMPR9		;DIFFERENT
	JUMPN E,DCMPR1		;TERMINATE ON NULL
	AOS -4(P)
DCMPR9:	JRST [	POP P,E
		POP P,D
		POP P,C
		POP P,B
		RET]
;DFDBCM DFDC10

;DFDBCM: COMPARE FDB'S POINTED TO BY G AND LPFDB
;COMPARE ONLY FIELDS TO BE PRINTED, PER DFILE FORMAT WORD IN E.
;SKIPS IF SAME. CLOBBERS B,C,D. ONE CALL IN "DFILE".

DFDBCM:	MOVE B,LPFDB
	JUMPE B,[RET]		;NO PREVIOUS FDB, GIVE "DIFFERENT" RET.
	MOVE C,FDBCTL(B)	;CONTROL BITS
	XOR C,FDBCTL(G)
	TLNE C,(FDBEPH)		;CHECK BITS WHICH MATTER
	 RET
	TRNN E,1B30		;GOING TO PRINT AUTHOR?
	 JRST .+5		;NO, SKIP CHECK
	HLRZ C,FDBUSE(B)	;AUTHOR
	HLRZ D,FDBUSE(G)
	CAIE C,0(D)		;SAME?
	 RET			;NO, GIVE "DIFF" RET
	TLNN BB,<3B17>B53 	;PROTECTION: IS IT TO BE LISTED?
	JRST .+4		;NO, CONTINUE COMPARING FIELDS
	MOVE C,FDBPRT(B)
	CAME C,FDBPRT(G) 	;IS IT SAME?
	RET			;NO, DIFFERENT
;;	TRNN BB,3B20		;ACCOUNT
;;	JRST .+4
;;	MOVE C,FDBACT(B)
;;	CAME C,FDBACT(G)
;;	RET
	TRNN BB,1B22		;SIZE IN PAGES
	JRST .+5
	HRRZ C,FDBBYV(B)
	HRRZ D,FDBBYV(G)
	CAME C,D
	RET
	TRNN BB,1B26		;BYTES
	JRST DFDC10
	MOVE C,FDBSIZ(B)
	CAME C,FDBSIZ(G)
	RET

;ALSO MAKE SURE BYTES ARE SAME SIZE:
	LDB C,[POINT 6,FDBBYV(B),11]
	LDB D,[POINT 6,FDBBYV(G),11]
	CAME C,D
	RET

;DATES AND TIMES
DFDC10:	MOVE C,FDBCRV(B)
	XOR C,FDBCRV(G)
	TRNN BB,1B27
	TRZ C,-1		;NOT TIME, MASK IT OUT.
	TRNE BB,1B23+1B27 	;CREATE DATE OR TIME TO BE PRINTED?
	JUMPN C,[RET]		;YES, TEST FOR SAME
	MOVE C,FDBWRT(B)
	XOR C,FDBWRT(G)
	TRNN BB,1B28
	TRZ C,-1
	TRNE BB,1B24+1B28
	JUMPN C,[RET]
	MOVE C,FDBRED(B)
	XOR C,FDBRED(G)
	TRNN BB,1B29
	TRZ C,-1
	TRNE BB,1B25+1B29
	JUMPN C,[RET]
	AOS (P)			;SAME!
	RET
;DFNOUT DFILL DFILL9

;DFNOUT: SUBROUTINE FOR DFILE.
;LIKE NOUT EXCEPT ADDS TRAILING SPACES, LIKE "DFILL" (NEXT),
;USING D IN SAME MANNER.
;REQUIRES A, B, C SET UP FOR NOUT, D FOR DFILL.
;CLOBBERS B, C.

DFNOUT:	PUSH P,A
	MOVE A,CSBUFP		;STRING BUFFER PTR
	NOUT			;CONVERT NUMBER TO STRING IN CORE
	 CALL JERRC		;JSYS ERROR ROUTINE FOR ERR # IN C
	SETZ C,
	IDPB C,A		;APPEND NULL (NOUT REALLY DOESN'T !)
	POP P,A
	MOVE B,CSBUFP

;DFILL: SUBROUTINE FOR DFILE.
;OUTPUT STRING B POINTS TO, THEN TYPE SPACES IF NECESSARY TO
;MAKE IT TAKE UP NUMBER OF COLUMNS SPECIFIED IN D.
;DESTINATION IN A; CLOBBERS B,C; RETURNS - # COLS OVERFLOW IN D.

DFILL:	HLRZ C,B
	CAIN C,-1
	HRLI B,<POINT 7,0,-1>B53	;FILL IN LH BYTE PTR FOR -1
	PUSH P,B
	SETZ C,
	SOUT
	POP P,B
	ILDB C,B
	SOJL D,DFILL9
	JUMPN C,.-2
	MOVEI B," "		;SPACES NEEDED
	TRNN E,1B32		;E B32 SUPPRESS COLUMNATION
	BOUT
	SOJGE D,.-2
DFILL9:	JUMPE C,[AOJA D,[RET]]	;REMOVE THE NULL TERMINATOR FROM COUNT
	ILDB C,B		;COUNT CHARS OVER SPECIFIED MINIMUM
	SOJA D,.-2
;OLDTAD OLDTA2

;OLDTAD
;LIST DECTAPE DIRECTORY IN 10/50 FORMAT
;TAKES: OUTDSG: OUTPUT JFN
;	A: DEVICE DESIGNATOR (UNIT # IN RH)
;AC USE: A: OUTJFN
;	F: POINTER TO BLOCK COUNT BUFFER IN PUSHDOWN
;	G: AOBJN POINTER DURING PRINTING

OLDTAD:	PUSH P,E
	PUSH P,F
				;DEVICE DESIGNATOR IS IN A

	MOVEI B,DIRBUF		;WHERE TO READ DIR TO
	RDDIR			;GET DEVICE DIRECTORY
	 CALL [	CAIN A,RDDIX1
		UERR [ASCIZ /Trouble reading directory,
 Maybe DECtape not on "remote"/]
		JRST JERR]

;SCAN "SLOTS" PORTION OF DIRECTORY, COUNTING BLOCKS ASSIGNED TO EACH
;FILE, AND FREE BLOCKS (THESE HAVE 0 FILE # BYTE).

	HRRZI F,1(P)		;WHERE BLOCK COUNT BLOCK WILL BE
	MOVEI B,↑D22
	PUSH P,[0]		;ALLOCATE AND CLR 23 WRDS FOR BLK COUNTS
	SOJGE B,.-1
	MOVE B,[POINT 5,DIRBUF]	;THERE IS ONE 5-BIT BYTE PER BLOCK
	MOVEI C,↑D578		;NUMBER OF BLOCKS
OLDTA2:	ILDB D,B		;GET FILE # FOR THIS BLOCK
	MOVE E,F
	ADD E,D
	CAIG D,↑D22		;IS IT A FILE # OR 0?

;NOTE: DIRECTORY BLOCK (100) AND TENDMP BLOCKS (0, 1, 2)
;  HAVE 36 IN THEIR SLOTS.
	AOS (E)			;INDEX BLOCK COUNT
	SOJG C,OLDTA2
;OLDTA4

;OLDTAD...
;TYPE # FREE BLOCKS
	MOVE A,OUTDSG
	MOVE B,(F)
	MOVEI C,↑D10		;FREE FORMAT, DECIMAL
	NOUT
	 CALL JERRC
	HRROI B,[ASCIZ /.  Free blocks left
/]
	SETZ C,
	SOUT

;TYPE EACH FILE IN THE FORM NNNNNN.EXT  BB  DD-MMM-YY
	HRLZI G,-↑D22		;NUMBER OF POSSIBLE FILES
OLDTA4:	ADDI F,1		;STEP TO NEXT COUNT WORD IN BLOCK IN PD
	SKIPN C,DIRBUF+↑D83(G)	;NAME
	JRST OLDTA7		;NONE, NO FILE FOR THIS FILE #
	MOVEI D,6
	SETZ B,
	LSHC B,6
	ADDI B,40		;CONVERT CHAR TO ASCII
	BOUT			;PRINT A CHARACTER OF NAME
	SOJG D,.-4
	HLLZ C,DIRBUF+↑D105(G)	;EXTENSION
	MOVEI B,"."		;SEPARATING CHARACTER: PERIOD,
	JUMPN C,.+2
	MOVEI B," "		;EXCEPT SPACE IF NO EXTENSION
	BOUT
	MOVEI D,5		;3 CHARS OF EXT AND 2 TRAILING SPACES
	SETZ B,
	LSHC B,6
	ADDI B,40
	BOUT			;PRINT A CHAR OF EXTENSION
	SOJG D,.-4

;NUMBER OF BLOCKS IN FILE: USE 3 COLUMNS, LEADING 0 IF <10,
;TRAILING SPACE IF <100, A LA DEC 10/50 SYSTEM.
	MOVE B,(F)		;# BLOCKS
	CAIL B,↑D10
	JRST .+3
	MOVEI B,"0"
	BOUT
	MOVE B,(F)		;# BLOCKS IN THIS FILE
	MOVEI C,↑D10
	NOUT
	 CALL JERRC
	MOVE C,(F)		;# BLOCKS ONCE MORE
	MOVEI B," "
	CAIGE C,↑D100
	BOUT			;FILL TO 3 COLS WITH A SPACE
	BOUT			;SEPARATING SPACE
;OLDTA7 OLDTA9 LITC5

;OLDTAD...
	LDB B,[POINT 12,DIRBUF+↑D105(G),35]		;DATE
	MOVEI C,1B35		;OR IN 3 MORE DATE BITS
	TDNE C,DIRBUF+0(G)	;NEW DEC DATE TANDARD
	TRO B,1B23
	TDNE C,DIRBUF+↑D22(G)
	TRO B,1B22
	TDNE C,DIRBUF+↑D44(G)
	TRO B,1B21
	CALL DTADAT		;TYPE DATE IN DECTAPE FORMAT
	MOVEI B,CR
	BOUT
	MOVEI B,LF
	BOUT
OLDTA7:	AOBJN G,OLDTA4
	SUB P,[↑D23,,↑D23]
;STEP PAST ALL JFNS THIS DECTAPE. ADDED 1/71
	TLZ Z,F2
	HRRZ A,@INIFH1
	GNJFN
	JRST OLDTA9
	TLNN A,70		;DEV OR DIR CHANGED ?
	JRST .-4
	TLO Z,F2
OLDTA9:	POP P,F
	POP P,E
	RET

	XLIST
LITC5:	LIT
	LIST
;..PRIN

SUBTTL PDP-10 TENEX EXECUTIVE  ** X4CMD.MAC **

;ROUTINES TO DECODE AND EXECUTE SPECIFIC COMMANDS, CONTINUED.
;THIS FILE CONTAINS MORE OF THE LONG AND LITTLE USED COMMANDS,
;SEGREGATED TO MINIMIZE PAGE FAULTS IN NORMAL USE.

;CONTENTS:
;	PRINT (NAME) <DIRECTORY NAME>		;PRINTS INFO ASSOC W DIRECTORY
;	CREATE (NAME) ...		;CREATES AND MODIFIES
		;DIRECTORIES (AND THUS USERS)
;↑E PRINT (NAME) <DIRECTORY NAME> [VERBOSE]

;PRINTS ALL OF THE CHARACTERISTICS ASSOCIATED WITH A DIRECTORY:
; PASSWORD, PRIVILEGES, MODE, SPECIAL RESOURCE INFO, DIRECTORY NUMBER,
;     DEFAULT FILE PROT, DIREC PROT, FILE RETENTION SPECS,
;     DIRECTORY & USER GROUPS.
;ADD'L KEYWORD "VERBOSE" OR SUBCOMMAND "VERBOSE" CAUSES ALL TO
;BE PRINTED, OTHERWISE ONLY NON-DEFAULT FIELDS.

..PRIN:	NOISE <name>
	CALL DIRNAM		;INPUT DIRECTORY NAME, GET # AND BITS IN A
	ALLOW TALT+TSPC+TEOL+TCOM
	ALTYPE ( )
	CALL SPRTR		;ANALYZE & CHECK TERMINATOR
	 JRST [		;R1: MORE ARG: ALLOW "PRINT NAME VERBOSE"
		KEYWD $PRINT
		 0		;NULL CAN'T GET HERE
		JRST CERR
		CALL (KWV)
		JRST .+2]
	 TLO Z,F1		;R2: COMMA, SAY GET SUBCOMMANDS
		;R3: END OF COMMAND
	CONFIRM
	CALL SUPER
	PUSH P,A		;SAVE USER # THRU SUBCOMMANDS
;	CALL BREAK2		;DON'T DO "BREAK" AND "REFUSE"
	TLNE Z,F1
	SUBCOM $PRINT		;INPUT SUBCOMMANDS
	POP P,A
	MOVEI A,(A)		;MASK USER #
	MOVEI B,1(P)		;BLOCK WILL BE IN PUSHDOWN
	HRRO C,CSBUFP		;PUT PASSWORD IN STRING STORAGE AREA
	MOVEI D,20		;ALLOCATE 20-WORD BLOCK IN PD (INCLUDES SPARE
	PUSH P,[0]		;...WORDS, BECAUSE ADDITIONS ARE LIKELY)
	SOJG D,.-1
	GTDIR		;GET ALL THE INFO INTO THAT BLOCK
	MOVEI E,(B)		;BLOCK LOCATION
	PUSH P,[CMDIN4]		;SET RETURN FOR "DIRPNT" & FALL IN
;DIRPNT PR1 PR2

;DIRPNT
;PRINT DIRECTORY DESCRIPTION FROM GTDIR-FORMAT BLOCK THAT E POINTS TO.
;OMITS DEFAULT VALUES UNLESS BIT F3 IN LH Z IS ON.
;FOR "PRINT" COMMAND AND FOR "LIST" SUBCOMMAND OF "CREATE".
;CLOBBERS B.

DIRPNT:	SKIPN A,(E)		;NAME IS NOT IN BLOCK FOR "PRINT".
	JRST PR1
	TYPE < Name >
	CALL CTYPE		;NAME FOR "CREATE" CASE
	PRINT EOL
PR1:	SKIPN A,1(E)
	JRST [	TLNE Z,F3
		UTYPE [ASCIZ / No password
/]
		JRST PR2]
	TLNN Z,F3		;DON'T PRINT PASSWORD IF NOT VERBOSE
	JRST PR2
	TYPE < Password >
	CALL CTYPE
	PRINT EOL
PR2:	MOVE B,2(E)		;DISK LIMIT
	TLNN Z,F3
	CAIE B,750		;DEFAULT VALUE
	ETYPE < Disk limit %2Q
>
;PRIVILEGES
	MOVE B,3(E)
	TRNN B,1B18
	CALL F3NOT
	TRZE B,1B18
	TYPE < Wheel
>
	TRNN B,1B19
	CALL F3NOT
	TRZE B,1B19
	TYPE < Operator
>
	TRNN B,1B20
	CALL F3NOT
	TRZE B,1B20
	TYPE < Confidential information access
>
	TRNN B,1B21
	CALL F3NOT
	TRZE B,1B21
	TYPE < Maintenance
>
	TRNN B,1B22
	CALL F3NOT
	TRZE B,1B22
	TYPE < Netwizard
>
	TLNN Z,F3
	JUMPE B,.+2		;NO MORE PRIVILEGES
	ETYPE < Other privilege bits %2O
>
;DIRPNT...
;MODE
	MOVE B,4(E)
	TLNN B,B0
	CALL F3NOT
	TLZE B,B0
	TYPE < Files only
>
;;	TLNN B,B1
;;	CALL F3NOT
;;	TLZE B,B1
;;	TYPE < Alphanumeric accounts
;;>
	TLNN B,B2
	CALL F3NOT
	TLZE B,B2
	TYPE < Suppress login messages
>
	TLNN Z,F3
	JUMPE B,.+2		;TEST FOR ADDITIONAL MODE BITS
	ETYPE < Other mode bits %2O
>

	SKIPN B,5(E)
	TLNE Z,F3
	ETYPE < Special resource information %2O
>
	SKIPN B,6(E)
	JRST [	TLNE Z,F3
		UTYPE [ASCIZ / No directory number
/]		;0: NOT ASSIGNED YET ("CREATE" CASE)
		JRST .+2]
	ETYPE < Directory number %2O
>
	MOVE B,7(E)
	TLNN Z,F3
	CAME B,[500000,,777752]		;DON'T PRINT IF STANDARD
	ETYPE < Default file protection %2O
>
	MOVE B,10(E)
	TLNN Z,F3
	CAME B,[500000,,777740]
	ETYPE < Directory protection %2O
>
;DIRP11 F3NOT

;DIRPNT...
DIRP11:	LDB B,[POINT 4,11(E),35]	;DEFAULT # VERSIONS TO KEEP
	TLNN Z,F3
	CAIE B,2		;2 IS DEFAULT
	ETYPE < Default # file versions to keep %2Q
>
	MOVE B,11(E)
	TRZ B,17		;MASK OFF DEFAULT # VERSIONS
	TLNN Z,F3
	CAME B,[5B2]		;SEEMS TO BE NORMAL VALUE 11/11/70
	ETYPE < Other file retention specifications %2O
>
	SKIPN A,12(E)
	JRST [	TLNE Z,F3
		UTYPE [ASCIZ / Never logged in
/]		;CAN'T USE REG CASE CAUSE %D TYPES CURRENT
		;DATE FOR 0
		JRST .+2]
	ETYPE < Last login %1D %1E
>
	SKIPN A,13(E)
	TLNE Z,F3
	ETYPE < User groups %1U
>
	SKIPN A,14(E)
	TLNE Z,F3
	ETYPE < Directory groups %1U
>
	PRINT EOL
	RET

;SUBROUTINE TO TYPE " NOT" AND SKIP IF F3 ON

F3NOT:	TLNN Z,F3
	RET
	TYPE < Not>
	JRST [	AOS (P)
		RET]
;$PRINT ..VERB

;"PRINT" SUBCOMMAND TABLE AND ROUTINES

$PRINT:	TABLE
	T VERBOSE,ONEWD,..VERB
	TEND

..VERB:	TLO Z,F3
	RET
;SUPER SUPER1 SUPPW

SUPER:	PUSH P,A
	PUSH P,B
	PUSH P,C
	PUSH P,D
	TYPE < [Superpassword:] >
	CALL NOECHO
	CALL CSTR
	CALL DOECHO
	ALLOW TALT+TSPC+TEOL
	CALL BUFFF
	MOVE B,[POINT 7,SUPPW,-1]
SUPER1:	ILDB C,A
	ILDB D,B
	CAME C,D
	JRST CERR
	JUMPN C,SUPER1
	PRINT EOL
	JRST [	POP P,D
		POP P,C
		POP P,B
		POP P,A
		RET]

SUPPW:	ASCIZ /TELEPHONE/
;.CREAT

;↑E CREATE (NAME) <DIRECTORY NAME> (PASSWORD) --
;EITHER FIELD CAN BE TERMINATED WITH COMMA TO INITIATE SUBCOMMANDS.
;CAN CREATE NEW DIRECTORIES OR MODIFY INFO ASSOCIATED WITH OLD ONES.
;E HOLDS FLAGS AND BLOCK POINTER WHICH WILL BE IN B FOR CRDIR.
;BLOCK IS IN PUSHDOWN.
;FLAGS IN LH E ARE SET ONLY FOR FIELDS EXPLICITLY INPUT BY USER,
;  BUT ALL INFO IS IN BLOCK FOR "LIST" SUBCOMMAND.

.CREAT:	NOISE <name>
	MOVEI E,1(P)		;RH E POINTS TO...
;ALLOCATE CRDIR PARAMETER BLOCK IN PUSHDOWN.
;INITIALIZE MOST WORDS TO THE SYSTEM DEFAULT VALUES SO THAT IN THE
;NEW NAME CASE THE SUBCOMMAND "LIST" WON'T PRINT IF THE VALUE
;HASN'T BEEN EXPLICITLY SPECIFIED.
	PUSH P,[0]
	PUSH P,[0]
	PUSH P,[750]		;DISK LIMIT
	PUSH P,[0]
	PUSH P,[0]
	PUSH P,[0]
	PUSH P,[0]
	PUSH P,[500000,,777752]		;DEFAULT FILE PROTECTION
	PUSH P,[500000,,777740]		;DIRECTORY PROTECTION
	PUSH P,[500000,,000002]		;FILE RETENTION SPECS
	PUSH P,[0]		;DATE AND TIME OF LAST LOGIN
	PUSH P,[0]		;USER GROUP BITS
	PUSH P,[0]		;DIRECTORY GROUP BITS
	PUSH P,[0]
	PUSH P,[0]		;EXTRAS, BECAUSE ADDITIONS ARE LIKELY
	PUSH P,[0]
	PUSH P,[0]
;CRET1A

;CREATE...
;INPUT NAME AND TYPE [OLD/NEW] AND GET CURRENT INFO FOR OLD.
	TLO Z,PUNCF
	CALL CSTR
	ALLOW TCOM+TALT+TSPC
	CALL BUFFF
	ALTYPE ( )
	PUSH P,A		;PTR TO NAME TEXT FOR USE IN AC1 FOR CRDIR
	MOVE B,A
	SETZ A,
	STDIR
	 JRST [	U$TYPE [ASCIZ /[New] /]
		TLO Z,F2		;LOCAL FLAG FOR "NEW NAME"
		JRST CRET1A]
	 CALL SCREWUP
	PUSH P,A		;SAVE FOR LATER
	$TYPE <[Old] >;
;	CALL BREAK2		;DO "BREAK" AND "REFUSE"
	POP P,A			;GET DIRECTORY NUMBER
	HRRZS A			;FLUSH LH BITS
	MOVE B,E
	MOVE C,CSBUFP
	GTDIR			;GET CURRENT INFO FOR OLD DIR
	IBP C
	MOVEM C,CSBUFP
		;AT THE END OF THE NAME FIELD COMMA MEANS "GO DIRECTLY
		;TO SUBCOMMAND INPUT".
		;BUT WE CAN'T CALL "SPRTR" HERE BECAUSE IT MIGHT READ AHEAD,
		;WHICH IS BAD BECAUSE A NOISE WORD FOLLOWS.
CRET1A:	TRNE CBT,TCOM
	JRST CRSUB
	TRNE CBT,TEOL		;EOL ENDS COMMAND, DON'T INPUT PASSWORD.
	JRST CREAT8		;(ERROR IF NEW, NOP IF OLD, BUT ANYWAY...)
;CREAT3 CREAT8 CREAT9 CRET9A

;CREATE...
;INPUT PASSWORD.
;FOR OLD DIRECTORY, THIS PASSWORD REPLACES OLD ONE - IS THAT GOOD?
	NOISE <password>
	TLO Z,PUNCF
	CALL CSTR
	ALTYPE ( )
	CALL BUFFF
	CAIG CNT,1
	JRST CREAT3		;NULL INPUT MEANS "NO CHANGE"
		;CAIN CNT,2
		;JRST [	MOVE B,.BFP		;1 CHAR INPUT, IS IT "-" ?
		;	ILDB B,B
		;	CAIN B,"-"	;JUST "-" MEANS MAKE IT NULL.
		;	MOVE A,[POINT 7,[ASCIZ //],-1]
		;	JRST .+1]
	MOVEM A,1(E)		;PASSWD STRING PTR TO PARAMETER BLOCK
	TLO E,B1		;TELL CRDIR TO SET PASSWORD
CREAT3:	CALL SPRTR		;TEST TERMINATING CHARACTER(S)
	 JRST CERR		; R1: MORE ARGS ON THIS LINE. ERROR.
	 JRST CRSUB		; B2: COMMA, GET SUBCOMMANDS.
		; R3: END OF COMMAND.
;CHECK, CONFIRM, EXECUTE

CREAT8:	TLZA Z,F1
CREAT9:	TLO Z,F1
	TLNE Z,F2		;NEW NAME
	TLNE E,B1		;PASSWORD SPECIFIED?
	JRST CRET9A
	MOVE A,4(E)
	TLNN A,B0
	ERROR < Password required for new name unless files-only>
CRET9A:		;CHECK FOR GIVING PRIVILEGES TO FILES-ONLY DIRECTORY & WARN?
	CONFIRM
	TLNN Z,F1
	CALL SUPER
	POP P,A		;POINTER TO NAME STRING
	TLNE Z,F2
	TLOE E,B0
	JRST .+2
	MOVEM A,(E)		;SUPPLY NAME IF NEW & NOT GIVEN WITH SUBCOMMAND
	MOVE B,E		;XWD FLAGS, PARAMETER BLOCK ADDRESS
	CRDIR		;CREATE DIRECTORY !
	 CALL JERR
	JRST CMDIN4
;CRSUB

;CREATE...
;SUBCOMMAND LOOP

CRSUB:	CONFIRM
	CALL SUPER
	SUBCOM $CREAT		;INPUT AND DISPATCH ON SUBCOMMANDS
	TLO KWV1,CONFRC		;FORCE CONFIRMATION
		;NOTE: CONFRC CAN'T BE USED IN NON-SUBCOMMAND CASE
		;BECAUSE SPRTR CAN READ CONFIRMING CHARACTER BEFORE "CONF"
		;GETS ITS CHANCE TO TYPE "[CONFIRM:]".
	JRST CREAT9
;$CREAT ....NO $$$$NO .MAILB

;CREATE...
;SUBCOMMAND DISPATCH TABLE
;FLAG B5 INDICATES "NOT" MAY PRECEDE THE SUBCOMMAND.

$CREAT:	TABLE
	TE ABORT,ONEWD
;;	TE ALPHANUMERIC,B5+LPROK,..ALPH
	TE CONFIDENTIAL,B5+LPROK
	T DEFAULT
	T DIRECTORY,B5+LPROK,..DIRE
	T DISK,LPROK,..DISK
	TE FILES,B5+LPROK
	TE KILL,B5+LPROK+CONMAN
	TE LIST,,..LIST
	TE MAINTENANCE,B5,.MAINT
	T MODE,B5
	T NAME
	TE NETWIZARD,B5,.NETWI
	T NO,,....NO
	T NOT,,..NOT
	T NUMBER,,...NUM
	TE OPERATOR,B5
	T PASSWORD
	T PRIVILEGES,B5
	T PROTECTION,LPROK,...PRO
	T RETENTION,B5+LPROK
	T SPECIAL,B5+LPROK
	TE SUPPRESS,B5+LPROK,.REPEA
	T USER,B5+LPROK,.USER
	TE WHEEL,B5
	TEND


....NO:	KEYWD $$$$NO
	 0			;NO DEFAULT
	JRST CERR
	JRST 0(KWV)

$$$$NO:	TABLE
	TE MAILBOX
	TEND

.MAILB:	ALLOW TSPC+TALT+TEOL
	CONFIRM
	TLO E,(1B15)		;"NO MSG FILE" FOR CRDIR
	RET
;..NOT .NAME .PASSW

;CREATE...
;"NOT" CAN PRECEDE THOSE SUBCOMMANDS WHICH HAVE B5 SET IN TABLE.
;DISPATCH IS TO SAME ROUTINE BUT WITH "F1" SET TO REVERSE EFFECT.

..NOT:	KEYWD $CREAT
	 0
	 JRST CERR
	TLNN KWV,B5
	JRST CERR
	MOVE KWV1,KWV
	TLO Z,F1
	JRST (KWV)

;ROUTINES FOR THE INDIVIDUAL SUBCOMMANDS

;NAME <NAME>. FOR CHANGING A DIRECTORY'S NAME.

.NAME:	TLO Z,PUNCF
	CALL CSTR
	CALL BUFFF
	ALLOW TALT+TSPC+TEOL
	CONFIRM
	JRST NIYE		;NOT IMPLEMENTED AS OF 6/28/70 ←←←←←←←←←←
	MOVEM A,(E)
	TLO E,B0
	RET

;PASSWORD
;CURRENTLY REDUNDANT EXCEPT THAT IT ALLOWS TYPIN IN A FORMAT MORE LIKE
; WHAT "PRINT" PUTS OUT AND ALLOWS GIVING A NULL STRING (USEFUL?).
;LATER I CLAIM PASSWORD FOR OLD DIRECTORY SHOULD BE TESTED FOR
; ACCESS PERMISSION BY NON-WHEELS (AND BE IGNORED FOR WHEELS), AND THIS
; COMMAND BE USED TO CHANGE PASSWORD. ←←←←

.PASSW:	TLO Z,PUNCF
	CALL CSTR
	CALL BUFFF
	ALLOW TALT+TSPC+TEOL
	CONFIRM
	MOVEM A,1(E)
	TLO E,B1
	RET

;..DISK .NETWI .MAINT .WHEEL .OPERA .CONFI CPRIV .FILES .REPEA CCMODE

;"CREATE" SUBCOMMANDS...

;DISK (STORAGE LIMIT) <DECIMAL>

..DISK:	NOISE <storage limit>
	CALL DECIN		;DECIMAL INPUT TO A
	 JRST CERR		;NULL
	ALLOW TALT+TEOL+TSPC
	CONFIRM
	MOVEM A,2(E)
	TLO E,B2
	RET

;SUBCOMMANDS FOR SPECIFIC PRIVILEGES AND MODES.
;F1 ON AT ENTRY IF PRECEDED BY "NOT".

;AC USE: A: MASK INDICATING BITS TO SET (F1 OFF), OR CLEAR (F1 ON).

.NETWI:	SKIPA 1,[1B22]
.MAINT:	MOVEI A,1B21
	JRST CPRIV
.WHEEL:	SKIPA A,[1B18]
.OPERA:	MOVEI A,1B19
	JRST CPRIV

.CONFI:	NOISE <information access>
	MOVEI A,1B20
CPRIV:	CONFIRM
	IORM A,3(E)		;SET BITS IN QUESTION
	TLNE Z,F1		;BUT IF SUBCOMMAND PRECEDED BY "NOT",
	ANDCAM A,3(E)		;CLEAR THE BITS.
	TLO E,B3
	RET

.FILES:	NOISE <only>
	HRLZI A,B0
	JRST CCMODE

;;..ALPH:	NOISE <accounts>
;;		HRLZI A,B1
;;		JRST CCMODE

.REPEA:	NOISE <login messages>
	HRLZI A,B2
CCMODE:	CONFIRM
	IORM A,4(E)		;SET BIT
	TLNE Z,F1		;PRECEDED BY "NOT"?
	ANDCAM A,4(E)		;YES, CLEAR BIT.
	TLO E,B4
	RET
;.PRIVI .MODE .SPECI CSPEC ...NUM NUMBE1

;"CREATE" SUBCOMMANDS...

;COMMANDS TO ENTER PRIVILEGES AND MODES IN OCTAL.
;THESE ALLOW ENTERING VALUES WHICH WEREN'T DEFINED WHEN THE CODE FOR
; "CREATE" WAS LAST UPDATED.
;CAN BE PRECEDED BY "NOT" TO TURN OFF RATHER THAN TURN ON THE GIVEN
; BITS.

.PRIVI:	CALL OCTCOM		;36-BIT OCTAL INPUT, LH,,RH ETC ACCEPTED.
	 JRST CERR
		;ALLOW TALT+TEOL+TSPC	;"OCTCOM" CHECKS TERMINATOR
	JRST CPRIV

.MODE:	CALL OCTCOM
	 JRST CERR
		;ALLOW TALT+TEOL+TSPC
	JRST CCMODE

;SPECIAL (RESOURCES INFORMATION) <OCTAL>. IRRELEVANT AT PRESENT.

.SPECI:	NOISE <resources information>
	CALL OCTCOM
	 JRST CERR
		;ALLOW TALT+TSPC+TEOL
CSPEC:	CONFIRM		;FUTURE SUBCOMMANDS FOR INDIV BITS CAN COME HERE
	IORM A,5(E)
	TLNE Z,F1
	ANDCAM A,5(E)
	TLO E,B5
	RET

;NUMBER <OCTAL>. SPECIFIES DIRECTORY NUMBER

...NUM:	CALL OCTAL
	 JRST CERR
	ALLOW TALT+TSPC+TEOL
	TLNN Z,F2
	JRST [	CAME A,6(E)
	 UERR [ASCIZ / You can't change the number of an old directory/]
		JRST NUMBE1]
;CHECK THAT THE NUMBER ISN'T IN USE BY TRYING TO CONVERT IT TO STRING.
	MOVE B,A
	MOVE A,CSBUFP
	DIRST
	SKIPA A,B		;NOT IN USE
	ERROR <Number already in use>
NUMBE1:	CONFIRM
	MOVEM A,6(E)
	TLO E,B6
	RET
;...PRO .DEFAU $DEFAU ....PR ..NUMB

;"CREATE" SUBCOMMANDS...

;PROTECTION (OF DIRECTORY) <OCTAL>. LATER ALSO ALLOW NAMED PROT?

...PRO:	NOISE <of directory>
	CALL OCTCOM		;OCTAL INPUT SUBR, ACCEPTS LH,,RH ETC.
	 JRST CERR
		;ALLOW TALT+TSPC+TEOL
	CONFIRM
	MOVEM A,10(E)
	TLO E,B8
	RET

;DEFAULT (FILE) PROTECTION <OCTAL>
;		NUMBER (OF VERSIONS TO KEEP) <DECIMAL>

.DEFAU:	NOISE <file>
	KEYWD $DEFAU
	 0
	 JRST CERR
	JRST (KWV)

$DEFAU:	TABLE
	T NUMBER,LPROK,..NUMB
	T PROTECTION,,....PR
	TEND

....PR:	CALL OCTCOM		;36-BIT OCTAL. OK? ←←←←←←←
	 JRST CERR
		;ALLOW TALT+TSPC+TEOL
	CONFIRM
	MOVEM A,7(E)
	TLO E,B7
	RET

..NUMB:	NOISE <of versions to keep>
	CALL DECIN
	 JRST CERR
	CAIL A,1
	CAILE A,15
	ERROR <Must be 1-15>
	ALLOW TALT+TSPC+TEOL
	CONFIRM
	DPB A,[POINT 4,11(E),35]
	TLO E,B9
	RET
;.RETEN .USER ..DIRE BITIN

;"CREATE" SUBCOMMANDS...
;[NOT] RETENTION (SPECIFICATIONS) <OCTAL>
;OR'S IN AND AND'S OUT, APPROPRIATE FOR BITS ONLY.

.RETEN:	NOISE <specifications>
	CALL OCTCOM
	 JRST CERR
	CONFIRM
	IORM A,11(E)
	TLNE Z,F1
	ANDCAM A,11(E)
	TLO E,B9
	RET

;[NOT] USER (GROUP) <DECIMAL BIT NUMBER>
;F1 ON IF PRECEDED BY "NOT"

.USER:	NOISE <group>
	CALL BITIN		;INPUT BIT NUMBER
	CONFIRM
	IORM A,13(E)
	TLNE Z,F1
	ANDCAM A,13(E)
	TLO E,B11
	RET

;[NOT] DIRECTORY (GROUP) <DECIMAL BIT NUMBER>

..DIRE:	NOISE <group>
	CALL BITIN
	CONFIRM
	IORM A,14(E)
	TLNE Z,F1
	ANDCAM A,14(E)
	TLO E,B12
	RET

;SUBROUTINE TO INPUT DECIMAL BIT NUMBER. RETURNS BIT SET IN A.
;FOR USER AND DIRECTORY GROUP SUBCOMMANDS

BITIN:	INHELP <Decimal number 0-35>
	TLO Z,BAKFF
	CALL DECIN
	 JRST CERR
	CAILE A,↑D35
	JRST CERR
	MOVN B,A
	HRLZI A,B0
	LSH A,(B)
	RET
;.KILL .ABORT ..LIST $.LIST

;"CREATE" SUBCOMMANDS...

;KILL (THIS DIRECTORY)

.KILL:	NOISE <this directory>
	CONFIRM
	TLO E,B16
	TLNE Z,F1
	TLZ E,B16		;"NOT KILL" REVERSES EFFECT.
	RET

;ABORT: ABORT THIS CREATE. REDUNDANT FOR ↑C.

.ABORT:	MOVEI A,RERET
	MOVEM A,CERET
	JRST CMDIN4		;GO GET NEXT EXEC COMMAND

;LIST. PRINTS WHAT "PRINT" WILL PRINT IF THIS "CREATE" IS COMPLETED.
;"LIST VERBOSE" PRINTS AS "PRINT" WITH VERBOSE SUBCOMMAND

..LIST:	KEYWD $.LIST
	 T <>,EOLOK,0
	 JRST CERR
	TLZ Z,F3
	CONFIRM
	TRNE KWV,F3
	TLO Z,F3
	TLNN E,B17
	JRST DIRPNT		;GO ACT LIKE "PRINT" COMMAND
	TYPE < Killed
>
	RET

$.LIST:	TABLE
	T VERBOSE,EOLOK,F3
	TEND
;.CYCLE ...DSK $$$DSK

;↑E CYCLE (THE NETWORK)

.CYCLE:	NOISE (the network)
	CONFIRM
	MOVE A,['IMPDRQ']
	MOVEI B,1
	OPRFN
	 JRST NIYE
	RET



;↑E DISK (PANIC LEVEL FOR) SYSTEM/USERS (IS) <NUMBER OF PAGES>

...DSK:	NOISE (panic level for)
	KEYWD $$$DSK
	 0
	 JRST CERR
	MOVE A,['USRSPC']	;VALUE IS 0 FOR SYSTEM, 1 FOR USERS
	TRNN KWV,-1
	MOVE A,['SYSSPC']
	PUSH P,A
	NOISE (is)
	CALL DECIN		;INPUT A DECIMAL NUMBER
	 JRST CERR		;NULL INPUT
	SKIPL A		;MAKE SURE IT IS REASONABLE
	CAILE A,↑D2000
	 ERROR <Unreasonable limit>
	PUSH P,A
	ALLOW TSPC+TALT+TEOL
	ALTYPE ( )
	CONFIRM
	POP P,B			;THE NUMBER
	POP P,A			;THE CELL NAME
	OPRFN
	 JRST NIYE		;COME ON CLEMENTS
	RET

$$$DSK:	TABLE
	T SYSTEM,LPROK+WHLUO+OPRUO,0
	T USER,LPROK+WHLUO+OPRUO,1
	TEND
;.EDDT EDDT3 EDDT4 EDDT5

;↑E EDDT
;TRANSFER CONTROL TO TENEX DDT, GETTING IT IF IT ISN'T ALREADY THERE.

.EDDT:	SKIPE DDTORG
	 JRST EDDT3		;DDT ALREADY THERE
	MOVE B,[POINT 7,[ASCIZ /<SUBSYS>UDDT.SAV/],-1]
	CALL $GTJFN		;ENTRY TO "$LPT" SUBR NEAR "DIRECTORY"
	HRLI A,B0		;SAY THIS FORK (JFN IS IN RH A)
	GET
	CALL RLJFNS
	MOVEI A,400000
	MOVE B,[EVECL,,EXEC]	;ENTRY VECTOR
	SEVEC			;MAKE EV POINT AT EXEC, NOT DDT


;IF WE CAN FIND A SYMBOL TABLE POINTER, PUT IT IN THE DDT.
EDDT3:	SKIPN A,..JBSYM		;HAVE WE SAVED SYMBOL TABLE POINTER?
	SKIPE A,.JBSYM		;NO, 10/50 SYMBOL TABLE POINTER?
	CAIA
	 JRST EDDT4		;NO. START DDT.
	MOVEM A,@DDTORG+1	;STORE SYMBOL TABLE POINTER INTO DDT
	MOVE B,..JBUSY
	SKIPN A			;SOURCE OF .JBUSY MUST BE SAME AS .JBSYM
	MOVE B,.JBUSY
	MOVEM B,@DDTORG+2
;DEASSIGN ↑C, SO THAT ↑C'S IN DDT WILL GO TO SUPERIOR EXEC.

EDDT4:	CALL INFER		;SKIP IF INFERIOR EXEC
	JRST EDDT5		;AT TOP LEVEL LEAVE ↑C ENABLED
	MOVEI A,B0		;THIS FORK
	RPCAP			;ENABLED CAPS INTO C
	MOVEI A,CTRLC
	TLNE C,B0		;↑C SPEC CAP ENABLED?
	DTI			;YES, DEASSIGN ↑C
EDDT5:	JRST DDTORG		;ENTER DDT
;.DISAB DISAB1 .ENABL ..LOGO

;DISABLE
;DISABLES PRIVILEGED COMMANDS,
;DISABLES USER (RH) SPEC CAPS IN EXEC AND INFERIOR FORK
; (CAPS POSSIBLE ARE STILL TRANSMITTED, SO INFERIOR CAN USE THEM
; IF IT ENABLES THEM ITSELF)

.DISAB:	SETZM PRVENF		;SAY PRIVILEGED COMMANDS OFF
DISAB1:	MOVEI A,B0		;"ENABLE" JOINS HERE
	RPCAP
	TRZ C,-1
	SKIPE PRVENF
	HRR C,B
	EPCAP		;EXEC'S CAPABILITIES
	SKIPG A,FORK
	RET		;NO INFERIOR, DONE
	RPCAP
	TRZ C,-1
	SKIPE PRVENF
	HRR C,B
	EPCAP		;INFERIOR'S CAPS
	RET

;ENABLE
;ENABLES OTHER PRIVILEGED COMMANDS IN EXEC, AND ENABLES
;RH (USER) SPECIAL CAPS IN EXEC AND IN INFERIOR FORK, IF THERE IS ONE.

.ENABL:	; CALL BREAK2		;"BREAK" AND "REFUSE"
	SETOM PRVENF		;SAY PRIVILEGED COMMANDS ENABLED
	JRST DISAB1

;↑ELOGOUT (JOB #)

..LOGO:	PUSH P,A
	GJINF
	CAMN 3,0(P)		;THIS JOB?
	ERROR <If you want to logout this job, use logout>
	MOVE 1,['JOBRT ']
	CALL $SYSGT		;TABLE OF RUNTIMES
	MOVE 1,2
	HRL 1,0(P)
	GETAB
	 CALL JERR
	JUMPGE 1,.+2		;REQUESTED JOB EXISTS?
	ERROR <That job does not exist>
	CONFIRM
	POP P,1
	LGOUT
	 CALL JERR
	JRST CMDIN4
;.HALT HALT0 HALT2 HALT3 HALT4 HALT7 $HALT ..HLTA ..HLTD $HLTDU ..HLTF ..HLTI ..HLTR ..HLTU

;HALT THE SYSTEM
; NO BITS LEFT IN COMMAND FLAGS FOR A "MAINTENANCE" CAP. BIT
; THUS, PRVCK CAN'T ALLOW "ENABLE", AND THUS, ↑E CANNOT PREFIX THE HALT.

.HALT:	CALL SPRTR		;ANALYZE SEPARATOR
	 JRST CERR		;R1: MORE FOLLOWS
	 TLO Z,F1		;R2: SUBCOMMANDS FOLLOW
	 CONFIRM		;R3: END OF COMMAND
	SETZM WHYHLT
	MOVEI 1,400000		;EXEC FORK
	RPCAP
	TRNN 3,1B18!1B19	;WHEEL OR OPERATOR MUST BE ENABLED
	TRNE 2,1B21		;MAINT. CANT ENABLE, DO IT FOR HIM
	CAIA
	 JRST CERR
	PUSH P,3		;ENABLED CAPABILITIES
	PUSH P,2		;POSSIBLE CAPABILITIES
;	CALL SUPER		;DON'T REQUIRE SUPERPASSWORD FOR HALT
	TLNN Z,F1		;SUBCOMMANDS?
	JRST HALT2		;NO.

HALT0:	MOVE 1,['SYSTAT']
	CALL $SYSGT
	JUMPE B,CERR		;NO SUCH TABLE??
	MOVSI 1,27
	HRR 1,2
	GETAB			;GET ANY CURRENTLY SET DOWN TIME
	 CALL JERR
	MOVEM 1,DOWNTM		;USE AS DEFAULT
	MOVSI 1,30
	HRR 1,2
	GETAB
	 CALL JERR
	MOVEM 1,UPTIME		;DEFAULT UP TIME
	SUBCOM $HALT		;DO SUBCOMMANDS TO MODIFY THESE
	JRST HALT3		;GO MAKE ABSOLUTE

HALT2:	MOVEI 1,17		;NO SUBCOM'S.  DOWN IN 17 MIN. (TO LET DATACOMPUTER WIND DOWN)
	MOVEM 1,DOWNTM
	SETZM UPTIME		;WHO KNOWS WHEN IT WILL BE UP AGAIN?


HALT3:	MOVE 1,UPTIME
	IOR 1,DOWNTM
	JUMPE 1,HALT4		;BOTH 0 ==> RETRACT
	SKIPN 2,DOWNTM		;SKIP IF ABSOLUTE OR REL.
	MOVEI 2,5		;NOT SET. DEFAULT TO 5 MIN.
	GTAD			;WHAT TO ADD REL. TO
	TLNE 2,-1		;DOWNTM IS ABS?
	JRST .+3		;YES
	CALL TIMPMN		;ABS IN 1 PLUS MINS IN 2
	MOVEM 1,DOWNTM		;THAT'S THE DOWN TIME

	SKIPE 2,UPTIME		;IF UPTIME IS NOT SET...
	TLNE 2,-1		;OR IS ABSOLUTE,
	 JRST HALT4		;THEN TAKE AS IS.
	MOVE 1,DOWNTM		;OTHERWISE IT IS RELATIVE TO DOWN TIME
	CALL TIMPMN		;TIME IN 1 PLUS MINUTES IN 2
	MOVEM 1,UPTIME

HALT4:	POP P,3			;CAPABILITIES POSSIBLE
	MOVEI 1,CTRLC		;↑C TERMINAL CODE
	TLNE 3,(1B0)		;↑C CAP. ENABLED?
	DTI			;YES, DEASSIGN IT
	MOVEI 1,400000		;THIS FORK
	EPCAP

HALT7:	MOVE 1,DOWNTM
	MOVE 2,UPTIME
	MOVE 3,WHYHLT		;REASON FOR HALTING
	HSYS
	 TLOA Z,F1		;REMEMBER HSYS FAILED
	TLZ Z,F1		;HSYS WAS OK
	MOVEI 1,400000
	POP P,3			;RESTORE CAPS. AS THEY WERE AT ENTRY
	EPCAP
	MOVE 1,[CTRLC,,1]	;↑C ON CHAN 1
	TLNE 3,(1B0)		;IF SPECIAL CAP IS ENABLED
	ATI
	TLNE Z,F1		;DID HSYS FAIL?
	 JRST CERR		;YES
	RET			;NO

$HALT:	TABLE
	T AT,LPROK,..HLTA
	T DUE,LPROK,..HLTD
	T FOR,LPROK,..HLTF
	T IN,LPROK,..HLTI
	T RETRACT,ONEWD,..HLTR
	T UNTIL,LPROK,..HLTU
	TEND


..HLTA:	NOISE <date and time>
	CALL DATEIN
	MOVEM A,DOWNTM
	RET


..HLTD:	NOISE <to reason>
	KEYWD $HLTDU
	 0
	 JRST CERR
	ALLOW TALT+TEOL
	ALTYPE ( )
	CONFIRM
	HRRZM KWV,WHYHLT
	RET

$HLTDU:	TABLE
	TE EMERGENCY,,8
	TE HARDWARE,,6
	TE PM,,5
	TE PREVENTIVE-MAINTENANCE,,5
	TE SOFTWARE,,7
	TEND

..HLTF:	NOISE <number of minutes>
	CALL DECIN
	 JRST CERR
	JUMPL A,CERR
	ALLOW TALT+TSPC+TEOL
	CONFIRM
	HRRZM A,UPTIME		;A RELATIVE TIME
	RET


..HLTI:	NOISE <number of minutes>
	CALL DECIN
	 JRST CERR
	JUMPLE A,CERR
	ALLOW TALT+TSPC+TEOL
	CONFIRM
	HRRZM A,DOWNTM		;A RELATIVE TIME
	RET

..HLTR:	NOISE <any pending shutdown request>
	SETZM DOWNTM		;NO KNOWN DOWN TIME
	SETZM UPTIME		;OR UPTIME
	SETZM WHYHLT		;OR REASON
	RET

..HLTU:	NOISE <date and time>
	CALL DATEIN
	ALLOW TALT!TEOL
	CONFIRM
	MOVEM A,UPTIME
	RET
;TIMPMN TIMPSC

;ADD THE MINUTES IN 2  TO THE TAD IN 1

TIMPMN:	IMULI 2,↑D60		;MAKE IT SECONDS



;ADD THE SECONDS IN 2  TO THE TAD IN 1

TIMPSC:	ADDI 2,0(1)		;ADD IN SECONDS FROM TAD
	IDIVI 2,↑D<60*60*24>	;NUMBER OF SECONDS IN A DAY
	MOVSS 2			;0 FOR TODAY, 1,,0 FOR TOMORROW, ETC
	ADD 1,2			;BUMP DAY
	HRR 1,3			;INSERT SECONDS
	RET
;.INITI $INITI

;;↑E INITIALIZED ACCOUNTS/HOSTS

REPEAT 0,<

.INITI:	KEYWD $INITI
	 0
	 JRST CERR
	MOVE A,['ACTINI']	;VALUE IS 0 FOR ACCOUNTS, 1 FOR HOSTS
	TRNE KWV,-1
	MOVE A,['HSTINI']
	CONFIRM
	OPRFN
	 JRST NIYE
	RET

$INITI:	TABLE
	TE ACCOUNTS,WHLUO+OPRUO,0
	TE HOSTS,WHLUO+OPRUO,1
	TEND
>
;.KFACT .LOAD .NETWO $NETWO

;↑E K (FACTOR IS) <FLOATING NUMBER>

REPEAT 0,<

.KFACT:	NOISE (factor is)
	CALL FPIN		;INPUT A FLOATING POINT NUMBER
	SKIPL A
	CAMLE A,[1.0]
	 JRST CERR
	ALLOW TSPC!TALT!TEOL
	CONFIRM
	MOVE B,A
	MOVE A,['KFACT ']
	OPRFN
	 CALL JERR
	RET

>


;↑E LOAD (EDDT)

.LOAD:	NOISE (EDDT)
	CONFIRM
	MOVE A,['DDTRCL']
	OPRFN
	 CALL JERR
	RET



;↑E NETWORK OFF/ON

.NETWO:	KEYWD $NETWO
	 0
	 JRST CERR
	CONFIRM
	HRRE B,KWV
	MOVE A,['NETON ']
	OPRFN
	 CALL JERR
	RET

$NETWO:	TABLE
	TE OFF,,0
	TE ON,,-1
	TEND
;.OFFLI .ONLIN .ONLI1

; ↑E OFFLINE (CORE FROM PAGE) ... (THROUGH PAGE) ...
; ↑E ONLINE (CORE FROM PAGE) ... (THROUGH PAGE) ...


.OFFLI:	TLZA Z,F1		;REMEMBER WHICH COMMAND
.ONLIN:	TLO Z,F1
	NOISE (core from page)
.ONLI1:	CALL OCTAL
	 JRST [	ALLOW TALT	;NO NUMBER, THINK ABOUT DEFAULT
		TLNN Z,F1	;"OFFLINE" HAS NO DEFAULT
		 JRST [	CALL DING
			JRST .ONLI1]
		MOVEI A,0
		U$TYPE [ASCIZ /0 /]
		JRST .+1]
	ALLOW TSPC+TALT+TLPR
	CAILE A,1237		;MAKE SURE IT'S A GOOD PAGE NUMBER
	 JRST CERR
	PUSH P,A		;SAVE FOR LATER
	NOISE (through page)
	CALL OCTAL
	 JRST [	ALLOW TALT
		MOVEI A,1237
		U$TYPE [ASCIZ /1237 /]
		JRST .+1]
	ALLOW TSPC+TALT+TEOL
	CAIG A,1237		;CHECK FOR REASONABLE PAGE NUMBER
	CAMGE A,0(P)		;AND ORDER
	 JRST CERR
	POP P,B			;FIRST PAGE
	MOVE C,A		;LAST PAGE
	CONFIRM
	TLNN Z,F1		;WHICH COMMAND
	SKIPA A,['MKPGSU']	;"OFFLINE"
	MOVE A,['MKPGSA']	;"ONLINE"
	OPRFN
	 CALL JERR
	RET
;..PAUS .PERMI .PROCE .PROHI

;↑E PAUSE

..PAUS:	NOISE (at BUGCHKs)
	CONFIRM
	MOVEI B,1
	MOVE A,['DCHKSW']
	OPRFN
	 CALL JERR
 RET



;↑E PERMIT

.PERMI:	NOISE (logins)
	CONFIRM
	MOVE A,['ENTFLG']
	SETO B,
	OPRFN
	 CALL JERR
	RET



;↑E PROCEED

.PROCE:	NOISE (at bugchks)
	CONFIRM
	MOVE A,['DCHKSW']
	SETZ B,
	OPRFN
	 CALL JERR
	RET



;↑E PROHIBIT

.PROHI:	NOISE (logins)
	CONFIRM
	MOVE A,['ENTFLG']
	SETZ B,
	OPRFN
	 CALL JERR
	RET
;.SYSTE $SYSTE

;↑E SYSTEM (IS) ...

.SYSTE:	NOISE (is)
	KEYWD $SYSTE
	 0
	 JRST CERR
	CONFIRM
	MOVE A,['DBUGSW']
	MOVEI B,0(KWV)
	OPRFN
	 CALL JERR
	RET

$SYSTE:	TABLE
	TE ATTENDED,,1
	TE DEGUGGABLE,,2
	TE UNATTENDED,,0
	TEND
;.SET INDT CHKDAT CHKDA4 CHKDA8 CHKDA9

;↑E SET (DATE AND TIME)

.SET:	NOISE <date and time>
		;FALL INTO "INDT" WHICH DOES THE REST

;SUBROUTINE TO INPUT AND SET DATE AND TIME
;FOR MAIN LOOP AND ↑E SET COMMAND.


INDT:	CALL DATEIN		;INPUT DATE AND TIME
	PUSH P,1
	CALL CHKDAT		;SKIP IF IT LOOKS OK
	 JRST [	TYPE < Please reconfirm: >
		MOVE 1,COJFN	;PRIMARY OUTPUT JFN
		MOVE 2,0(P)	;DATE TYPED IN
		SETOM 3		;VERBOSE FORMAT
		ODTIM
		TLO KWV1,CONMAN
		CONFIRM
		JRST .+1]
	POP P,A
	STAD			;SET TIME AND DATE
	 CALL [	CAIN A,STADX1	;SPEC CAP NOT ENABLED ERROR?
		RET		;YES. GO QUIETLY AWAY
		JRST JERR]
	RET


;CHECK TYPED IN TIME TO BESURE IT IS OK FOR STAD
; CURRENTLY THIS MEANS WITHIN 11 HRS. AFTER LAST FACT FILE WRITE

CHKDAT:	PUSH P,1
	INTOFF			;BE SURE JFN WILL GET STACKED
	MOVSI 1,(1B2!1B17)
	HRROI 2,[ASCIZ /<OPERATIONS>OPERATIONS.LOG/]	;(STANDARD IS <ACCOUNTS>FACT. )
	GTJFN
	 JRST [	INTON		;CAN'T GET JFN, FORCE RECONFIRMATION
		JRST CHKDA9]	;NO-SKIP RETURN
	MOVE 2,JBUFP		;JFN STACK PTR
	PUSH 2,1		;SAVE FOR RELEASE AT ↑C OR ERROR
	MOVEM 2,JBUFP
	INTON
	MOVE 1,0(2)		;GET THE JFN BACK
	MOVE 2,[1,,FDBWRT]
	MOVEI 3,3
	CALL $GTFDB		;DON'T SKIP IF ACCESS LACKING
	 JRST CHKDA8
CHKDA4:	CAML 3,0(P)		;DATE TYPED MUST BE AFTER FILE WRITE
	 JRST CHKDA8		;NOT SO
	MOVE 1,3
	MOVEI 2,↑D<11*60*60>	;TIME LIMIT = 11 HRS.
	CALL TIMPSC		;GTAD IN 1 PLUS SECONDS IN 2, TO 1
	CAML 1,0(P)		;11HRS AFTER FILE WRT BEFORE INPUT ?
	 AOS -1(P)		;DATE LOOKS GOOD, SKIP

CHKDA8:	CALL RLJFNS
CHKDA9:	POP P,1
	RET
;.TRAPS $TRAPS ..UNLO

REPEAT 0,<

; ↑E TRAPS OFF/ON

.TRAPS:	NOISE (of JSYS's)
	KEYWD $TRAPS
	 0
	 JRST CERR
	CONFIRM
	MOVE A,['JTRPON']
	HRRE B,KWV
	OPRFN
	 CALL JERR
	RET

$TRAPS:	TABLE
	TE OFF,,0
	TE ON,,-1
	TEND
>


;↑E UNLOAD EDDT

..UNLO:	NOISE (EDDT)
	CONFIRM
	MOVE A,['DDTFSH']
	OPRFN
	 CALL JERR
	RET
	LIT
;.NETLO NETLO0 NETLO2

SUBTTL ** X5CMD.MAC **

;NETLOAD

IFN DST10X,<

;PRINTS THE 5 MIN. LOAD AVERAGES FROM
; ALL COOPERATING TENEX SITES.  THIS INFORMATION IS KEPT IN
; THE FILE <SYSTEM>RSYSTAT.;1   PAGE 0.

;WORD-0 OF THE PAGE RSSER VERSION # OR -1 IF BEING UPDATED
;WORD-1 IS N,,PTR  WHERE  N  IS THE LENGTH OF THE BLOCK ASSOCIATED
; WITH EACH SITE, AND PTR IS THE RELATIVE ADDRESS OF THE FIRST
; SITE BLOCK.
;WORD-5 IS GTAD FORMAT TIME OF LAST UPDATE
;WORD-10 (IF PTR .GE. 10) HAS SIZE,,OFFSET OF SITE INFO

;EACH SITE BLOCK HAS THE FOLLOWING THINGS OF INTEREST IN IT
; (OFFSET IS 6 FOR OLD FORMAT (N .LE. 10):

;WORD-0:	SITE NUMBER
;WORD-4:	-1 IF DATA IS GOOD FOR THIS SITE
;WORD-(0 + OFFSET):	AMOUNT OF USER CORE (IF N .GT. 10)
;WORD-(1 + OFFSET):	1 MIN. LOAD AV.
;WORD-(2 + OFFSET):	5 MIN. LOAD AV.
;WORD-(3 + OFFSET):	15 MIN. LOAD AV.
;WORD-(4 + OFFSET):	NUMBER OF USERS
;WORD-(5 + OFFSET):	NUMBER OF DISK PAGES IN USE
;WORD-(6 + OFFSET):	NUMBER OF FREE DISK PAGES


.NETLO:	HRROI 2,[ASCIZ /<SYSTEM>RSYSTAT.;1/]
	CALL TRYGTJ		;ASSIGN AND STACK JFN
NETLO0:	 ERROR <Network load statistics not available>
	MOVE 2,[44B5+1B19+1B25]	;READ, THAWED
	OPENF
	 JRST NETLO0		;GO TYPE ERROR
	HRLZS 1			;FROM FILE PAGE 0
	MOVE 2,[400000,,<NSBUF/1000>]	;TO ADDRESS SPACE
	MOVSI 3,(1B2!1B9)	;READ, COPY ON WRITE
	PMAP
	MOVES NSBUF		;MAKE PAGE PRIVATE (STROBE DATA)
	SKIPGE NSBUF+0		;CHECK VERSION NUMBER
	 UERR [ASCIZ / Data base being updated/]

; INSPECT TIME OF LAST UPDATE TO SEE IF DATA IS VALID

NETLO2:	GTAD			;NOW
	SUB 1,NSBUF+5		;MINUS LAST UPDATE
	TRNE 1,1B18		;SECONDS WRAPPED AROUND?
	ADD 1,[-1,,↑D<24*60*60>];YES, BORROW A DAY
	SKIPE NSBUF+1		;PARANOIA
	CAIL 1,↑D<5*60>		;UPDATED WITHIN LAST 5 MINUTES?
	 UERR [ASCIZ / Server dead/]
;NETLO4 NETL41 NETL42 NETL43 NETL44 NETLO5 NETL55 NETL56 NETL57 NETLO6 NETL69 NETLO9 NETLOX

NETLO4:	HRRZ 1,NSBUF+1		;CHECK PTR
	CAILE 1,10		;TEST FOR NEW FORMAT
	TLOA Z,F1		;YES, REMEMBER THAT
	TLZ Z,F1		;NO

NETL41:	TLNE Z,F1
	 JRST NETL43
NETL42:	TYPE <  Sits		 Load  Users
>
	JRST NETL44
NETL43:	TYPE <  Site		 Load  Users  Disk Av.
>

NETL44:	HRRZ D,NSBUF+1		;PTR TO FIRST SITE BLOCK
	MOVEI E,6		;OFFSET FOR OLD FILES
	TLNE Z,F1		;NEW FORMAT?
	HRRZ E,NSBUF+10		;YES, USE IT
	ADDI E,0(D)		;D AND E DIFFER BY OFFSET

NETLO5:	MOVE 1,COJFN
	SKIPN NSBUF(D)		;END OF ALL SITES?
	 JRST NETLOX		;YES, DONE.
	MOVE 3,NSBUF+4(D)
	CAME 3,[-1]		;DO WE HAVE GOOD DATA FOR THIS ONE?
	 JRST NETLO9		;NO SKIP IT
	MOVEI 2," "
	BOUT
	MOVE 2,NSBUF+0(D)	;GET BACK SITE NUMBER
	MOVEI 3,↑D10
	CVHST			;PRINT HOST NAME, OR ...
	 NOUT			;NUMBER IF THAT FAILS
	  JFCL

;BE APPROPRIATELY SUSPICIOUS OF THE FILE FORMAT
NETL55:	PRINT TAB
	RFPOS
	MOVEI 2,0(2)
	CAIG 2,↑D10		;WAS FIRST TAB ENOUGH?
	PRINT TAB		;NO
	SKIPGE 2,NSBUF+2(E)	;THAT SITE'S 5 MIN. LOAD AV
	JRST NETL57		;MUST BE POSITIVE
	MOVE 3,2
	TLZN 3,(1B1)
	JRST NETL56		;LOAD LESS THAN 0.5 -- OK
	TLNN 3,370000		;EXPONENT TOO BIG?
	TLNN 3,400		;NOT NORMALIZED FLOATING NUMBER?
	 JRST NETL57		;YES.
NETL56:	MOVE 3,[1B4+1B6+2B23+2B29] ;FORCE, WITH ".", 2 BEFORE AND AFTER
	FLOUT
NETL57:	 TYPE <  ?  >
	TYPE <  >
	MOVE 3,[1B2+3B17+12]	;RIGHT JUST, 3 COLS, DECIMAL
	SKIPL 2,NSBUF+4(E)	;NUMBER OF USERS ON THAT SYSTEM
	NOUT
	 TYPE <  ?>


NETLO6:	TLNN Z,F1
	 JRST NETL69		;OLD FORMAT
	MOVE 2,NSBUF+6(E)	;DISK SPACE AVAILABLE
	MOVE 3,[1B2!11B17!↑D10]	;RIGHT JUSTIFIED, 9 COLS, DECIMAL
	NOUT
	 CALL JERRC
NETL69:	PRINT EOL


NETLO9:	HLRZ 1,NSBUF+1		;SITE BLOCK LENGTH
	ADDI D,0(1)		;BUMP TO NEXT BLOCK
	ADDI E,0(1)
	JRST NETLO5		;AND DO IT

NETLOX:	SETOM 1
	MOVE 2,[400000,,<NSBUF/1000>]
	PMAP			;FLUSH PAGE
	PRINT EOL
	JRST RLJFNS		;GO RELEASE THE JFN

>;IFN DST10X
;READY READY4 READY2 READY3

;SUBROUTINES TO PRINT READY CHARACTER: "@" NORMALLY, 
; "!" IF PRIVILEGED COMMANDS ENABLED.

READY:	PUSH P,A
	PUSH P,B
	MOVE A,COJFN
	RFPOS
	TRNN B,-1		;AT LEFT MARGIN?
	JRST READY4		;YES
	MOVEI B,CR		;NO, TYPE CRLF FIRST
	BOUT
	MOVEI B,LF
	BOUT
READY4:	MOVEI B,"↑"
	SKIPLE XFORK
	 BOUT
	CALL INFER
	 JRST READY3
	MOVEI B,"←"
	MOVN C,STRTAC		;COUNT OF LEVELS DOWN
	BOUT
	AOJL C,.-1		;ONE "←" FOR EACH LEVEL
	JRST READY3

READY2:	CALL READY		;PRINT 2 READY CHRS FOR SUBCOMMANDS
	PUSH P,A		;PRINT ONE READY CHARACTER
	PUSH P,B
	MOVE A,COJFN
READY3:	MOVEI B,"@"
	SKIPE PRVENF
	MOVEI B,"!"
	BOUT
	POP P,B
	POP P,A
	RET
;%KEYW
;KEYWORD INPUT AND LOOKUP UUO SERVICE ROUTINE ("KEYWD" UUO)

SUBTTL ** XSUBRS.MAC **

;DOES EDITING, TABLE LOOKUP, RECOGNITION.
;DEFAULTS: ON NULL INPUT, OR WITHOUT INPUT IF LAST TERMINATOR = EOL,
;	OR IF DASH AND TERMINATOR INPUT
;
;USAGE:
;	SET FLAGS BAKFF,PUNCF,NEOLF IF DESIRED
;	 (SEE COMMENTS IN FILE XDEF.MAC)
;	KEYWD TABLE
;	0 OR XWD [VALUE],[ASCIZ @TEXT@] FOR DEFAULT VALUE
;	R1: NOT IN TABLE, OR NULL INPUT WITH NO DEFAULT IN CALL.
;	    "BAKFF" IS SET SO SAME INPUT IS USED ON NEXT CALL.
;       R2: FOUND, "VALUE" IN "KWV"
;   ON EITHER RETURN, TERMINATOR IS IN "TRM" AND "CHR",
;   DESCRIPTIVE BITS FOR TERMINATOR IN "CBT"
;   TEXT IS APPENDED TO "CBUF", "BFP" IS END BYTE PTR, ".BFP", BEG.
;   PUNCF AND NEOLF ARE CLEARED
;   EOLNEF SET IF AN EOL WAS INPUT AND WAS NOT ECHOED
;
;GOES DIRECTLY TO "CERR" ON BAD CHARACTER, TOO LONG, AMBIGUOUS, ETC
;ACCEPTABLE CHARACTERS ARE LETTERS AND DIGITS ONLY UNLESS "PUNCF" ON.
; ("-" ALSO ACCEPTED MERELY TO SIMPLIFY CODING DEFAULT ON "-" IN INPUT.)
;TERMINATORS: ALT MODE, SPACE, COMMA IF "COMOK" ON IN VALUE (OW←CERR),
;EOL OR SEMICOLON IF "EOLOK" ON IN VALUE,
;LEFT PAREN IF "LPROK" ON IN VALUE,
;"<" IF "LANOK" ON IN VALUE (SPECIAL TREATMENT DESCRIBED BELOW).
;
;DEFAULTING: ON ALT MODE DEFAULT TEXT IS TYPED; GOOD RETURN IS GIVEN
;	AS THOUGH DEFAULT TEXT HAD BEEN INPUT.
;
;BACKUP: IF "BAKFF" IS SET AT ENTRY, PREVIOUS INPUT STRING IS RE-USED.
;
;GLITCH NOTE: IF LAST TERMINATOR IS EOL OR SEMICOLON,
;	DEFAULTS WITHOUT INPUT, SO OPTIONAL FIELDS
;	AT END OF COMMAND ARE AUTOMATICALLY DEFAULTED.  
;	BUT THIS DOESN'T HAPPED IF BAKFF IS SET (EXTERNALLY). ALSO THIS
;	MEANS "TEOL" BIT IN AC "CBT" MUST BE OFF
;	AT FIRST CALL ON A NEW LINE.
;
;TABLE FORM:
;       TABLE:  NUMBER OF ENTRIES
;               XWD [VALUE],[ASCIZ @TEXT@]  FOR EACH ENTRY, ALPH ORDER
;		;"VALUE" HAS BITS IN LEFT HALF (SOME INTERPRETED HERE),
;		;	USUALLY DISPATCH ADDRESS IN RIGHT HALF
;%KEYW CWRD2 CWRD3 CWRD3A

%KEYW:	PUSH P,D
        PUSH P,C
        PUSH P,B
        PUSH P,A
	PUSH P,40
	TLNE Z,BAKFF
	JRST .+3
	TRNE CBT,TEOL		;LAST TERMINATOR=EOL OR SEMICOLON?
	JRST [	SKIPN D,@-5(P)	;YES, DEFAULT ARGUMENT GIVEN?
		JRST .+1
		JRST CWRD2]	;YES, GO DEFAULT WITHOUT INPUTTING
;INPUT.  "INHELP" MACRO INPUTS A FIELD (WITH CSTR), DOING EDITING &
;RE-USING PREVIOUS INPUT IF "BAKFF" ON, AND TYPES MESSAGE IF "?" INPUT.
;%Z TYPES ALL KEYWORDS IN TABLE.  CSTR HANDLES NEOLF AND EOLNEF.
	MOVE A,(P)		;TABLE ADDRES FOR %Z
	INHELP <One of the following:
%1Z>;
		;CHECK THAT FIELD TERMINATOR IS LEGAL
	ALLOW TEOL+TSPC+TALT+TCOM+TLPR+TLAN
;LEFT-JUSTIFY AND ZERO-FILL THE STRING IN CWBUF BECAUSE "FSYM"
; REQUIRES IT THAT WAY.
	SETZM CWBUF
        SETZM CWBUF+1
        SETZM CWBUF+2
        SETZM CWBUF+3
	CAILE CNT,↑D18		;WILL IT FIT 4-WORD BUFFER
	ERROR <Word too long>
        MOVE B,.BFP        ;BEGINNING OF STRING
        MOVEI C,-1(CNT)    ;REDUCE COUNT BY ONE TO OMIT TERMINATOR
	JUMPG C,CWRD3		;JUMP IF NON-NULL INPUT
	 SKIPN D,@-5(P)		;PICK UP WORD AFTER CALL
	 JRST CWRD8		;NO DEFAULT SPECIFIED IN CALL
CWRD2:	 HLRZ C,D		;PRETEND WE RETURNED FROM FSYM: [VALUE],
	 HRLI D,<POINT 7,0,-1>B53 ;.. BYTE POINTER TO TEXT
	 JRST CWRD4		;USE CODE FOR "UNIQUE SUBSET" MATCH
CWRD3:  MOVE D,[POINT 7,CWBUF,-1]
CWRD3A:	ILDB A,B        	;COPY LOOP
	CAIL A,141		;ASCII LOWER CASE A
	CAILE A,172		;ASCII LOWER CASE Z
	JRST .+2		;NOT A LOWER CASE LETTER
	SUBI A,40		;CONVERT LOWER CASE TO UPPER
        IDPB A,D
        SOJG C,CWRD3A
	CAIN CNT,2		;CHECK FOR "-": 1 CHAR+TERMINATOR?
	JRST [	CAIN A,"-"	;YES, WAS THAT CHARACTER "-"?
		SKIPN D,@-5(P)	;YES, PICK UP WORD AFTER CALL
		JRST .+1	;NOT "-" OR NO DEFAULT PTR AFTER CALL
		HLRZ C,D	;PRETEND WE GOT EXACT MATCH RETURN...
		JRST CWRD5]	;...FROM FSYM: [VALUE] IN C
;CWRD4 CWRD5 CWRD6

;%KEYW...
;LOOK IT UP
        MOVE A,(P)         ;POINTER THAT CAME IN 40
        MOVEI B,CWBUF      ;LOCATION OF TEXT 
        CALL FSYM          ;SEARCH TABLE (A) FOR TEXT (B). 4 RETURNS.
		;R1: NO MATCH AT ALL. GIVE BAD RETURN WITH "BAKFF" SET.
	 JRST CWRD8
        ;R2: AMBIGUOUS PARTIAL MATCH. ALLOW MORE INPUT IF ALT MODE.
         JRST      [CAIE CHR,ALTM
                JRST CERR          ;TERMINATOR NOT ALT MODE
		CALL DING	;RING BELL, STOP NON-INTERACTIVE JOB,
				;CLEAR TTY INPUT BUFFER.
		CALL UBP	;GET RID OF ALT MODE IN BUFFER
                JRST MORE]         ;GET MORE INPUT, RETN WHERE CSTR DID 
        ;R3: UNIQUE PARTIAL MATCH. TYPE REST ON ALT MODE.
		;ALSO, DEFAULT COMES HERE W TEXT PTR TO ENTIRE TEXT
CWRD4:   JRST      [CAIE CHR,ALTM
                JRST .+1           ;NOT ALT MODE, OK AS IS.
		MOVE B,(C)	;USED BY PRVCK
		CALL PRVCK	;CHECK PRIVILEGE BEFORE PRINTING REST
		 JRST CERR	;PRIVILEGE NEEDED & LACKING
                CALL UBP	;BACK UP
		TLO Z,STCF 	;SAY "STORE PRINTED CHARACTERS"
                MOVE A,D           ;POINTER TO REST RETURNED BY "FSYM"
                CALL CTYPE        ;PRINT AND ALSO STORE STRING
                TLZ Z,STCF
                JRST CWRD6]		;PRIVILEGES ARE ALREADY CHECKED.
        ;R4: PERFECT MATCH.
		;ALSO, "-" INPUT DEFAULT COMES HERE
;CHECK WHETHER THE USER HAS SPECIAL PRIVILEGES REQUIRED 
; BY CERTAIN KEYWORDS (MOST DON'T REQUIRE ANY).

CWRD5:	MOVE B,(C)		;VALUE WORD INCLUDES PRIVILEGE FLAGS
	CALL PRVCK		;SKIP IF USER HAS PRIVS, IF ANY REQUIRED
	 JRST CERR		;HE LACKS PRIVILEGES.
CWRD6:	MOVE KWV,(C)       ;VALUE WORD. "FSYM" RETURNED PTR TO IT.
	TLNN KWV,NSPALT		;THIS BIT SAYS DON'T...
	ALTYPE ( )		;TYPE SPACE AFTER WORD TERMINATED WITH ALT MODE.
;CWRD8

;%KEYW...
;WORD HAS BEEN FOUND IN TABLE.
;CHECK CERTAIN TERMINATORS VS CERTAIN FLAGS.
	TRNE CBT,TCOM
         JRST [	TLNN KWV,COMOK
                JRST CERR
                JRST .+1]
	TRNE CBT,TLPR
	 JRST [	TLNN KWV,LPROK
		JRST CERR
		JRST .+1]
	TRNE CBT,TEOL
         JRST [	TLNN KWV,EOLOK+ONEWD		;ONEWD IMPLIES EOLOK
                JRST CERR
                JRST .+1]
	TRNE CBT,TLAN
	 JRST [	TLNN KWV,LANOK
		JRST CERR
		;SPECIAL HANDLING OF "<" TERMINATOR, VALID ONLY IN
		;CONTEXTS WHERE IT IS REALLY THE BEGINNING OF THE
		;THE NEXT FIELD: SET UP BAKFF, CNT, .BFP SO
		;THAT NEXT CSTR WILL RETURN 1-CHAR STRING "<".
		;VALUES OF CNT AND .BFP FOR CURRENT KEYWORD ARE LOST.
		MOVE .BFP,BFP
		CALL UBP		;UNINCREMENTS BFP
		EXCH .BFP,BFP
		MOVEI CNT,1
		TLO Z,BAKFF
		JRST .+1]
;EXIT
        AOSA -5(P)      ;SKIP
CWRD8:	TLO Z,BAKFF		;ON BAD RETURN SET "BACK UP FIELD" FLAG
	AOS -5(P)		;GET PAST DEFAULT ARGUMENT WORD
	POP P,40
	POP P,A
        POP P,B
        POP P,C
        POP P,D
        RET
;PRVCK PRVCK8

;PRVCK
;SUBROUTINE TO CHECK SPECIAL CAPABILITIES THIS USER HAS AGAINST THOSE
; REQUIRED AS INDICATED BY BITS IN B, GENERALLY FROM
; A KEYWORD TABLE.
;SKIPS UNLESS SPEC CAP(S) ARE REQUIRED BUT USER HAS NONE OF THEM.
;USES: FORK COMMAND (XCMD1.MAC), %KEYWD (JUST ABOVE).

PRVCK:	TLNN B,WHLUO+OPRUO+ERRUO+WOEPUO
	JRST [	AOS (P)		;NO SPEC CAP REQUIRED, QUICK EXIT.
		RET]
	PUSH P,A		;COMMAND REQUIRES SPECIAL CAPABILITIES
	PUSH P,B
	PUSH P,C
	PUSH P,D
	MOVE D,B
	MOVEI A,B0
	RPCAP		;READ CAPABILITIES ENABLED FOR THIS PROCESS
	TLNE D,WOEPUO		;WOEPUO REQUIRES WHEEL, OPER, OR CONF INF ACCESS
	TRNN B,1B18+1B19+1B20		;...POSSIBLE BUT NOT NECESSARILY
	JRST .+2		;...ENABLED.
	JRST PRVCK8
	TLNE D,WHLUO
	TRNN C,1B18
	JRST .+2
	JRST PRVCK8		;WHEEL COMMAND AND "ENABLE"D WHEEL USER
	TLNE D,OPRUO
	TRNN C,1B19
	JRST .+2
	JRST PRVCK8		;OPERATOR COMMAND AND "ENABLE"D OPERATOR USER
	TLNE D,ERRUO
	TRNN C,1B20		;TEST "CONFIDENTAIL INFORMATION ACCESS" CAP
	JRST .+2
PRVCK8:	AOS -4(P)
	POP P,D
	POP P,C
	POP P,B
	POP P,A
	RET
;FSYM - SYMBOL TABLE LOOKUP SUBROUTINE USED IN %KEYW (PRECEDING)

;SYMBOL TABLE LOOKUP SUBROUTINE

;TAKES:	A: POINTER TO TABLE
;	B: WORD POINTER TO INPUT STRING TO SEARCH FOR. MUST BE LEFT
;	   ADJUSTED, NULL TERMINATED, LAST WD FILLED W NULLS.
;	CALL FSYM
;RETURNS: +1: NO MATCH AT ALL
;	+2: INPUT IS AMBIGUOUS -- IT IS INITIAL SUBSTRING OF MORE
;	    THAN ONE TABLE ENTRY'S TEXT
;	+3: INPUT IS INITIAL SUBSTRING OF A UNIQUE TABLE ENTRY
;	    D: BYTE POINTER TO REST OF THAT ENTRY'S TEXT
;	    C: "VALUE" FROM THAT TABLE ENTRY IN RH
;	+4: INPUT EXACTLY MATCHES A TABLE ENTRY
;	    C: AS FOR +3
;	AC'S UNCHANGED EXCEPT AS INDICATED

;TABLE FORM:
; LABEL: NUMBER OF ENTRIES
;	 XWD VALUE,[ASCIZ /TEXT/] PER ENTRY
;	   .
;	   .
; ENTRIES MUST BE ALPHABETICALLY ORDERED ON ASCII COLLATING SEQUENCE
;  (AS OPPOSED TO ALGEBRAICALLY ORDERED ON 36-BIT WORD VALUES)

;AC USE
;   A	POINTS AT LAST ENTRY IN TABLE
;   B   POINTER WHICH IS INDEXED THRU INPUT TEXT
;   C   POINTER INTO TABLE
;   D   WORD OF INPUT TEXT
;   E   POINTER WHICH IS INDEXED THROUGH THE TEXT OF A TABLE ENTRY
;   F   WORD OF TEXT FROM TABLE ENTRY
;   G   "DELTA" - THE BINARY SEARCH INCREMENT

 IFN E-D-1,<BARF>		;E=D+1 IS ASSUMED
;FSYM

;FSYM ENTRY

FSYM:	PUSH P,A		;SAVE AC'S
	PUSH P,B
	PUSH P,C
	PUSH P,D
	PUSH P,E
	PUSH P,F
	PUSH P,G

	HRRZ A,-6(P)
;INIT DELTA TO HIGHEST POWER OF 2 IN TABLE LENGTH
	MOVE D,(A)		;TABLE LENGTH
	JFFO D,.+2
	JRST NOMAT		;0 LENGTH: NO MATCH
	MOVEI G,1
	MOVN E,E
	LSH G,43(E)		;SHIFT BY 35 - # OF 0 BITS TO GET POWER

	MOVEI C,(A)		;INIT POINTER THAT RUNS OVER TABLE
	ADD A,(A)		;LOCATION OF LAST USED ENTRY IN TABLE
;FSRC1 FSRC1A FSRC2 UPAR APAR NOMAT FSRC3 FSRC4

;FSYM...

; BINARY SEARCH. STOPS AT = ENTRY OR SMALLEST > ENTRY.

FSRC1:	ADDI C,(G)		;ADD DELTA TO TABLE POINTER
FSRC1A:	LSH G,-1		;HALVE DELTA FOR NEXT TIME AROUND
	CAILE C,(A)
	JRST FSRC4		;POINTS BEYOND END OF TABLE, GO BACK UP.
;COMPARE THE INPUT TEXT TO A TEXT IN THE TABLE
	MOVE B,-5(P)		;GET PTR TO INPUT TEXT SUPPLIED IN B
	MOVE E,(C)		;POINTER INTO TABLE TEXT FROM TABLE WORD
FSRC2:	MOVE D,(B)		;GET AN INPUT WORD
	LSH D,-1		;POSITION SO DATA ISN'T IN SIGN BIT
	MOVEI B,1(B)		;INDEX INPUT POINTER
	MOVE F,(E)		;GET A WORD OF TABLE TEXT
	LSH F,-1
	CAMGE F,D
	JRST FSRC3		;TABLE ENTRY LESS THAN INPUT
	CAME F,D
	JRST FSRC4		;TABLE ENTRY GREATER THAN INPUT 
	TRNE D,177		;THESE WORDS EQUAL, AT END OF INPUT?
	AOJA E,FSRC2		;NO, INDEX TABLE TEXT PTR, CONT. COMPARE

;MATCH FOUND.
;CODE FOR EXITS, SEARCH STUFF CONTINUES AFTER THIS.
	AOS -7(P)		;INCREMENT RETURN ADDRESS
UPAR:	AOS -7(P)
	HLRZ D,(C)		;VALUE FIELD FROM ENTRY WHICH MATCHED
	MOVEM D,-4(P)		;RETURN SAME IN C
APAR:	;AT THIS POINT C POINTS TO THE = OR SMALLEST > TABLE ENTRY
	; & COULD BE RETURNED FOR USE IN INSERTION OR DELETION
	AOS -7(P)
NOMAT:	POP P,G		;RESTORE AC'S
	POP P,F
	POP P,E
	POP P,D
	POP P,C
	POP P,B
	POP P,A
	RET		;RETURN

;THE TEXT OF THIS TABLE ENTRY IS LESS THAN INPUT STRING

FSRC3:	JUMPN G,FSRC1		;DELTA><0, MOVE DOWN AND CONTINUE SEARCH
	AOJA C,NEM1		;DONE SEARCH. NEXT ENTRY IN TABLE IS THE
		;SMALLEST LARGER ENTRY. IF THERE IS NO NEXT ENTRY, THEN
		;THERE IS NO MATCH. "SBST" SUBR IS CODED TO HANDLE THIS 

;THIS TABLE ENTRY GREATER THAN INPUT, OR POINTER IS OF END OF TABLE

FSRC4:	SUBI C,(G)		;MOVE UP IN TABLE
	JUMPN G,FSRC1A		;UNLESS DELTA=0, CONTINUE SEARCH.
;NEM1 NEM2

;FSYM...

;WE GET TO "NEM1" WHEN THE SEARCH COMPLETES WITHOUT FINDING AN EXACT
;MATCH.  C POINTS TO SMALLEST TABLE ENTRY GREATER THAN INPUT.
;THIS ENTRY MAY OR MAY NOT BE A SUBSET MATCH; IF IT IS, THEN IT IS 
;AMBIGUOUS IF AND ONLY IF NEXT ENTRY IS ALSO A SUBSET MATCH.
;NOTE ALSO THAT WE CAN TEST NEXT ENTRY FIRST, AND IF IT IS SUBSET,
;THEN WE KNOW INPUT IS AMBIGUOUS WITHOUT TESTING THIS ENTRY.

;TEST NEXT ENTRY

NEM1:	ADDI C,1		;POINT C AT NEXT ENTRY
	CALL SBST		;SUBSET TEST SUBR COMPARES ENTRY C TO INPUT
	SOJA C,NEM2		;R1: NOT A SUBSET (INCLUDES NO NEXT ENTRY)
	SOJA C,APAR		;R2: IS A SUBSET, SO INPUT IS AMBIG. GIVE R2.

;NOT AMBIGUOUS, SO TEST THIS ENTRY

NEM2:	CALL SBST
	JRST NOMAT		;INPUT NOT SUBSET THIS ENTRY, NO MATCH
	MOVEM E,-3(P)		;IS A SUBSET. RETURN BYTE POINTER TO REST OF
	JRST UPAR		;  TABLE  ENTRY IN D. GIVE R2.
;SBST SBST1

;SUBROUTINE SBST FOR FSYM

;SUBSET TEST SUBROUTINE FOR "FSYM".
;COMPARES INPUT STRING AND STRING FOR TABLE ENTRY C POINTS TO,
; SKIPS IF FORMER IS INITIAL SUBSTRING OF LATTER.
;ON R2, RETURNS IN E A BYTE POINTER TO REST OF TABLE ENTRY STRING
;MUST BE CALLED ONLY WHEN INPUT STRING IS LESS THAN TABLE STRING
;SEE "FSYM"'S COMMENTS ON AC USE. CLOBBERS B,D,E,F,G.

SBST:	CAILE C,(A)		;C BEYOND END OF TABLE?
	RET		;YES, NO ENTRY, INPUT ISN'T SUBSET, RETURN.
;FIND FIRST WORD OF STRINGS IN WHICH THEY DIFFER
	MOVE B,-6(P)		;POINTER TO INPUT TEXT
	MOVE E,(C)		;POINTER TO TABLE ENTRY'S TEXT
SBST1:	MOVE D,(B)		;WORD OF INPUT
	LSH D,-1		;POSITION FOR COMPARE
	MOVEI B,1(B)		;INDEX INPUT POINTER
	MOVE F,(E)		;WORD OF TABLE ENTRY
	LSH F,-1		;POSITION
	CAMGE F,D		;REMOVE AFTER DEBUGGING
	 CALL SCREWUP		;.. GO TO EXEC'S PROGRAM ERROR ROUTINE
	CAMG F,D
	AOJA E,SBST1		;IF ITS = IT MUST NOT BE END.
	TRNE D,177		;IS DIFFERENCE IN LAST WORD OF INPUT?
	RET		;NO, INPUT CAN'T BE SUBSTRING OF TABLE ENTRY.
;MASK OFF TABLE TEXT TO LENGTH OF INPUT
	HRLZI G,-4
	TDNE D,	[-1		;LOOP TO SEE HOW MANY BYTES OF D ARE 0
		1777777777
		7777777
		37777
		177 ] (G)		;YES, (G).
	AOBJN G,.-1
	ANDCM F,@.-2		;THIS CLEARS F WHERE THERE ARE BITS IN TABLE
;CONVERT WORD PTR IN E TO BYTE POINTER AS REQUIRED ON R2.
	HLL E,	[POINT 7,0,-1
		POINT 7,0,6
		POINT 7,0,13
		POINT 7,0,20
		POINT 7,0,27 ] (G)
;NOW IF MASKED PART OF TABLE WORD = INPUT WORD, INPUT IS SUBSET.
	CAMN F,D
	AOS (P)		;SKIP
	RET
;%NOI

;%NOI
;NOISE WORD UUO SERVICE ROUTINE ("NOISE" MACRO)
;
;ARGUMENT IS AN ASCIZ TEXT
;IF LAST TERMINATOR IS ALT MODE, TYPE " (<GIVEN TEXT>) ".
;IF SPACE, COMMA, OR COLON, PASS FOLLOWING PARENTHESIZED TEXT (IF ANY), 
;  REQUIRING THAT INPUT BE A PROPERLY ORDERED SUBSET OF GIVEN.
;  AN ALT MODE IN PARENTHESIZED TEXT CAUSES REST OF GIVEN TO BE OUTPUT,
;     AND "TRM" TO BE SET TO ALT MODE.
;IF !, SPECIAL BEHAVIOR FOR LOGIN COMMAND:  TYPE " (<GIVEN TEXT>) ",
;  THEN ALSO PASS PARENTHESIZED TEXT, IF ANY, AS AFTER SPACE (IN CASE
;  A COMMAND FILE, MIMICING A TYPESCRIPT, CONTAINS THE TEXT).
;IF LEFT PAREN, SIMILARLY PASS TEXT TO ) OR ALT MODE.
;OTHER TERMINATORS  PRODUCE NO ACTION.
;
;CAVEAT: IF TRM IS SPACE OR COMMA AND THERE IS NO (TEXT),
;	%NOI HAS READ AHEAD ONE INPUT FIELD (AND SET BAKFF). SO DON'T
;	TRY TO OUTPUT ANYTHING BETWEEN CALL TO %NOI AND NEXT INPUT.

%NOI:	PUSH P,40           ;SAVE ARGUMENT ADDRESS
	TRNE CBT,TLPR
	JRST NOI0
	CAIE TRM,"!"
	TRNE CBT,TALT
        ;FOR ALT MODE OR ! TYPE GIVEN TEXT
        JRST       [U$TYPE [ASCIZ /(/]
                POP P,40
		PUSH P,40		;KEEP IT IN PD ALSO
                U$TYPE @40
		U$TYPE [ASCIZ /) /]
		CAIE TRM,"!"
		JRST [	POP P,40
			RET]
		;THE FOLLOWING IS JUST LIKE "JRST NOIA"
		;EXCEPT ECHOING, IF OFF, IS NOT TURNED ON.
		TLO Z,NEOLF
		CALL CSTR
		CAIN TRM,"("
		CAILE CNT,1
		JRST [	TLO Z,BAKFF
			JRST [	POP P,40
				RET]]
		JRST NOI0A]
	TRNN CBT,TSPC+TCOM+TCOL		;SPACE, TAB, COMMA, OR COLON?
        JRST [	POP P,40        ;OtHER TERMINATORS IGNORED
		RET]
;NOIA NOI0 NOI0A

;%NOI...
;SPACE AND COMMA GET HERE
;PASS UP (TEXT), WHERE TEXT IS ANY SUBSET OF GIVEN IN ORIGINAL ORDER,
;WITH ANY NUMBER OF ADDED SPACES.

;FIRST WE MUST SEE IF NEXT CHARACTER IS "(". BEFORE DOING THIS, WE
;MUST INPUT AN ENTIRE FIELD, TO MAKE EDITING CHARACTERS WORK
;RIGHT (CONSIDER THE CASE WHERE USER TYPES LETTER, BAKSLASH,  "(" ).

NOIA:	TLO Z,NEOLF		;DON'T ECHO EOLS - FIELD MAY BE A FILE NAME
	CALL CSTR		;INPUT A FIELD
	CAIN TRM,"("		;WAS INPUT "(",
	CAILE CNT,1		;WITH NOTHING BEFORE IT?
	JRST [	TLO Z,BAKFF		;NO "(". BACK OUT AND RETURN.
		;UNECHOED EOL WILL BE ECHOED IF APPROPRIATE AT NEXT
		;"CSTR" OR AT "CONF"
		JRST [	POP P,40
			RET]]
	TLNE Z,NECHOF		;ECHOING OFF (PASSWORD) ?
	PRINT (TRM)		;YES, PRINT THE "(".
;INPUT CHARACTERS TILL ) OR ALT MODE.
;CAN'T PROCESS DURING INPUT BECAUSE OF EDITING.
; ( AS LAST TERMINATOR COMES HERE

NOI0:	TLNE Z,NECHOF		;ECHOING OFF?
	CALL DOECHO		;YES, PUT IT ON SO NOISE WORD IS ECHOED
NOI0A:	CALL CSTR         ;INPUT TILL ANY TERMINATOR
	TRNE CBT,TRPR+TALT		; ) OR ALT MODE?
        JRST NOI1
	TRNE CBT,TSPC		;SPACE OR TAB?
        JRST MORE          ;AFTER SPACE GET MORE (RETURNS TO .-4)
        JRST CERR          ;EOL, SEMICOLON, COMMA, ETC ILLEGAL HERE.
;NOI1 IGNOI2 IGNOI1 IGNOI3

;%NOI...
;MATCH LOOP: INPUT CHAR IS OK IF IT MATCHES A CHARACTER IN GIVEN
;STRING AFTER LAST ONE MATCHED. IGNORE SPACES IN BOTH STRINGS.

NOI1:   EXCH A,(P)      ;SAVE A, GET POINTER TO GIVEN.
        PUSH P,B
        PUSH P,C
        PUSH P,D
        HRLI A,<POINT 7,0,-1>B53        ;FORM BYTE PTR TO GIVEN
        MOVE C,.BFP        ;BYTE PTR TO INPUT
IGNOI2: ILDB D,C        ;GET AN INPUT CHARACTER
	CAIL D,141		;ASCII LOWER CASE A
	CAILE D,172		;ASCII LOWER CASE Z
	JRST .+2		;NOT A LOWER CASE LETTER
	SUBI D,40		;CONVERT LOWER CASE TO UPPER
	CAIE D,TAB
        CAIN D," "
        JRST IGNOI2
        CAIN D,")"
                ; RIGHT PAREN TERMINATES LOOP
IGNOI1: JRST       [POP P,D           ;EXIT
                POP P,C
                POP P,B
                POP P,A
                RET ]
        CAIN D,ALTM
                ;ON ALT MODE TERMINATION, PRINT REST OF GIVEN AND ).
        JRST       [CALL UBP         ;BACK UP BFP TO UNBUFFER ALT MODE
                TLO Z,STCF      ;SAY APPEND PRINTED CHARS TO CWBUF
                CALL CTYPE        ;PRINT REST OF GIVEN (A POINTS TO IT)
                UTYPE [ASCIZ /) /]		;ADD ) AND SPACE TO IT
                TLZ Z,STCF
                JRST IGNOI1]       ;EXIT 
IGNOI3: ILDB B,A        ;GET A GIVEN CHARACTER
	CAIL B,141		;LOWER CASE A
	CAILE B,172		;LOWER CASE Z
	CAIA			;NOT A LOWER CASE LETTER
	 SUBI B,40		;GIVE IT A RAISE
        CAIN B," "
        JRST IGNOI3
        JUMPE B,CERR    ;MATCH FAILS IF GIVEN ENDS BEFORE INPUT
        CAME B,D        ;MATCH?
        JRST IGNOI3        ;NO, TRY NEXT GIVEN ON SAME INPUT CHAR
        JRST IGNOI2        ;YES, GO TO NEXT CHAR IN BOTH STRINGS
;%SBCOM SBCOM1 SBCOM9

;SBCOM UUO
;INPUT AND DISPATCH ON SUBCOMMANDS, USING TABLE EFFECTIVE ADDR POINTS TO
;TERMINATES ON NULL SUBCOMMAND OR ONE WITH 0 DISPATCH ADDRESS
;USES INCLUDE DIRECTORY, COPY, PRINT, CREATE, TYPE/LIST

%SBCOM: PUSH P,CERET
	PUSH P,.P
	PUSH P,.JBUFP
	PUSH P,KWV1
	PUSH P,E
	PUSH P,40
SBCOM1:	MOVEI A,SBCOM1
	MOVEM A,CERET		;SAY COME BACK HERE AFTER PRINTING ERROR MESSAGE
	MOVEM P,.P		;PD LEVEL TO RESTORE AFTER ERROR
	MOVE A,JBUFP
	MOVEM A,.JBUFP		;JFN STACK LEVEL TO BE RESTORED AFTER ERROR
	MOVE BFP,[POINT 7,CBUF,-1]		;COMMAND STRING BUFFER POINTER
	CALL READY2		;TYPE 2 READY CHARACTERS: @@ OR !!
	SETZB TRM,CBT		;CLEAR TERMINATOR AND BITS: EOL HERE WOULD
		;MAKE "KEYWD" DEFAULT THO IT SHOULDN'T.
	TLZ Z,BAKFF+PUNCF+NEOLF+EOLNEF+DASHF
		;AN OBSCURE CASE IN "DIRECTORY" LEAVES NEOLF ON,
		;WHICH TURNS EOLNEF ON IN CONFIRM, WHICH SCREWS UP
		;FOLLOWING "KEYWD".
	KEYWD @(P)		;INPUT A KEYWORD AND LOOK UP IN CALLER'S TABLE
	 T <>,ONEWD,SBCOM9		;NULL DEFAULTS TO THIS.
	 JRST CERR		;ERROR IF NOT FOUND IN TABLE
	TLZ Z,F1		;REQUIRED BY SOME COMMANDS, EG "CREATE".
	MOVE KWV1,KWV		;SAVE KEYWORD'S BITS FOR "CONFIRM" ETC
	TLNE KWV1,ONEWD		;IF "ONE WORD COMMAND" BIT ON,
	CONFIRM		;CONFIRM BEFORE DISPATCH
	MOVE E,-1(P)		;PRESERVE E FOR "CREATE"
		;(I DON'T THINK IT CAN GET CLOBBERED ANYWAY)
	TRNN KWV1,-1
	CALL SBCOM9		;0 DISPATCH ADDRESS MEANS TERMINATE SUBCOMMANDS
	CALL (KWV1)		;CALL CALLER'S ROUTINE FOR THIS SUBCOMMAND
	MOVEM E,-1(P)
	JRST SBCOM1		;GO GET ANOTHER

;TERMINATING SUBCOMMAND INPUT

SBCOM9:	SUB P,[XWD 2,2]		;FORGET SUBCOMMAND RETURN AND 40
	POP P,E
	POP P,KWV1
	POP P,.JBUFP
	POP P,.P
	POP P,CERET
	RET
;%INHEL UINHE9

;UINHEL UUO (INHELP MACRO)
;INPUT STRING WITH CSTR (NEXT). IF STRING CONSISTS OF "?" ONLY,
; OR ? AND A TERMINATOR, "ETYPE" THE MESSAGE THE EFFECTIVE ADDRESS
;POINTS TO, RETYPE COMMAND LINE SO FAR, AND INPUT ANOTHER STRING.

%INHEL:	PUSH P,A
	PUSH P,40
	CALL CSTR
	CAILE CNT,2
	JRST UINHE9		;TOO LONG
	MOVE A,.BFP
	ILDB A,A		;FIRST CHARACTER
	CAIE A,"?"
	JRST UINHE9		;NOT "?"
	MOVE BFP,.BFP		;DISCARD "?" STRING
	PRINT " "
	MOVE A,-1(P)		;CALLER'S A FOR ETYPE
	UETYPE @(P)		;GIVEN MESSAGE
	CAMN BFP,[POINT 7,CBUF,-1]		;AFTER NULL COMMAND,
	U.$ERR 0		;USE ERROR CODE TO RESTORE P, RETYPE READY
		;CHARACTERS, RESTART COMMAND.  U.$ERR DOESN'T
		;CLEAR INBUF, 0 MEANS NO MESSAGE. NOTE THAT
		;AT LEAST THE FIRST FEW AC'S AREN'T RESTORED.
	ETYPE (%Y)		;RETYPE INPUT LINE
	CALL CSTR		;INPUT ANOTHER STRING
;EXIT: FIX THINGS UP SO "MORE" CAN BE USED AS AFTER A CALL
; DIRECTLY TO "CSTR".

UINHE9:	SUB P,[XWD 1,1]		;FORGET 40
	POP P,A
	POP P,CSTRR		;STORE RETURN FOR USE BY "MORE"
	JRST @CSTRR
;CSTR AND MORE
;INPUT A FIELD SUBROUTINE (CSTR),
;AND APPEND TO FIELD REENTRY POINT (MORE).
;FIELD CONSISTS OF 0 OR MORE CHARACTERS CONSISTING OF
;   LETTERS AND DIGITS, AND ALSO PUNCTUATION IF "PUNCF" IS ON.
;   "-" IS ACCEPTED IN FIELD TO SIMPLIFY CODING "-" FOR NULL FIELD.
;ANY OTHER CHARACTER IS FIELD TERMINATOR.
;FLAG "BAKFF" CAUSES PREVIOUSLY INPUT FIELD TO BE USED AGAIN.
;   CAVEAT: EXACTLY THE SAME FIELD IS AGAIN RETURNED IF "PUNCF"
;	   WAS ON AND HAS BEEN TURNED OFF.
;	   NO KNOWN CASES WHERE THIS MATTERS. 3/4/70
;FLAG "NEOLF" SUPPRESSES EOL ECHOING.  THIS IS USED WHEN A FILE
;	NAME IS BEING INPUT, BECAUSE "GTJFN" PRINTS EOL WHERE
;	APPROPRIATE EVEN IF EOL IS IN STRING NOT ON FILE.
;
;ACCEPTS: "BFP": POINTER TO CURRENT END OF COMMAND STRING
;   "MORE" ALSO REQUIRES THAT .BFP, CNT, CHR, TRM, AND CBT
;	         HAVEN'T BEEN CLOBBERED.
;RETURNS: "BFP": NEW END
;         ".BFP": BEGINNING = OLD END
;         "CNT": # OF CHARACTERS IN FIELD
;            (USED BY ↑A AND ↑W SO MUST BE PRESERVED IF "MORE" IS USED)
;         "TRM" AND "CHR": TERMINATING CHARACTER
;	  "CBT": CHRTBL WORD FOR TERMINATING CHAR -- DESCRIPTIVE BITS
;		SUCH AS "TEOL", "OCTDIG", ETC.
;	  FLAGS BAKFF, PUNCF, NEOLF CLEAR
;	  FLAG EOLNEF SET IF UNECHOED EOL INPUT
;
;"MORE" DOESN'T INITIALIZE .BFP AND CNT.
;"MORE" RETURNS TO WHERE "CSTR" WAS LAST CALLED FROM. 
;     BEWARE OF PD LEVEL BEING DIFFERENT!
;CSTR CSTR0 CSTR1 CSTR2 CSTR3 CSTR5

;CSTR AND MORE...
;BEGIN NEW FIELD ENTRY

CSTR:   POP P,CSTRR        ;SO "MORE" RETURNS SAME PLACE
	TLNE Z,NEOLF		;SUPPRESSION OF EOL ECHOING REQUESTED?
		;THIS FEATURE IS USED WHEN READING A STRING TO
		;BE FED TO GTJFN, WHICH PRINTS THE EOL ITSELF.
	JRST [	CALL NOECEO		;YES, CHANGE CCOC SO EOL'S NOT PRINTED
		JRST CSTR0]
	TLZE Z,EOLNEF		;NO. ECHO PREVIOUSLY UNECHOED EOL FROM PRECEDING
	PRINT EOL		;FIELD OR FROM THIS FIELD IF BAKFF ON.
CSTR0:	TLZE Z,BAKFF		;TEST AND CLEAR "RE-USE SAME FIELD" FLAG
		;RE-USE SAME FIELD: CHECK LAST TERMINATOR AGAIN, TO
		;MAKE IT READ MORE IN THE CASE WHERE "PUNCF" WAS OFF AND NOW
		;IS ON. THIS CAN HAPPEN IN FILE NAME COLLECTION.
	JRST CSTR2		;(USUALLY JUST EXITS.)
	CALL NALNBK		;SET BREAK SET TO NON-ALPHANUMERICS
CSTR1:	MOVE .BFP,BFP		;BEGIN A NEW INPUT FIELD TO PREVENT
	SETZ CNT,		;...EDITING.
	CALL CCHRI		;INPUT A CHARACTER, STORE, PROCESS EDIT CHARS
CSTR2:	TLNE Z,CTRLVF		;IF PRECEDED BY ↑V,
	JUMPN CHR,CSTR3		;ANY CHAR BUT NULL IS PART OF FIELD.
	TRNN CBT,ALPHAN		;IS IT ALPHANUMERIC (INCLUDES "-")?
	JRST CSTR5		;NO.
CSTR3:	CALL CCHRI		;YES, INPUT AND STORE NEXT CHARACTER.
	JRST CSTR2
;HAVE A NON-ALPHANUMERIC CHARACTER

CSTR5:	TLNE Z,PUNCF		;ARE WE ALLOWING PUNCTUATION IN FIELD?
	TRNN CBT,PUNBIT		;YES, IS IT A PUNCTUATION CHARACTER?
	JRST .+2
	JRST CSTR3
;CSTR9

;CSTR AND MORE...
;HAVE PROBABLE TERMINATOR.
;BUT IF ITS SPACE OR TAB AND CNT=1, THEN ITS A LEADING CHARACTER THAT
;   MUST BE IGNORED.
;LEADING CHARACTERS MUST BE IGNOZED HERE, NOT IN A LOOP AT BEGINNING
;   OF FIELD INPUT, TO HANDLE CASE WHERE TYPIST DELETES ENTIRE
;   FIELD WITH EDITING CHARACTERS, THEN TYPES A SPACE OR TAB.
	CAIG CNT,1		;ANY CHARS BEFORE IT?
	JRST [	TRNE CBT,TSPC		;IS IT A SPACE, TAB, OR & ?
		JRST CSTR1		;YES, IGNORE IT.
		JRST .+1]		;NO, IT TERMINATES FIELD.
;REALLY HAVE TERMINATOR
	MOVE TRM,CHR
        PUSH P,A
        PUSH P,B
        SETZ A,
        MOVE B,BFP
        IDPB A,B        ;STORE 0 AFTER STRING. NEEDED FOR FILE NAMES.
        POP P,B
        POP P,A
CSTR9:	TLZ Z,PUNCF		;CLEAR "PUNCTUATION CHARACTERS ALLOWED" FLAG
	TLZE Z,NEOLF		;CLEAR "DON'T ECHO EOLS" FLAG
	CALL DOECEO		;AND CHANGE CCOC SO EOLS WILL PRINT
	PUSH P,CSTRR        ;RETURN
        RET

;ENTRY TO ADD MORE CHARACTERS TO SAME FIELD AND RETURN TO WHERE "CSTR"
;WAS CALLED.
MORE=CSTR3
;PASCOM PASCM1 %ALLOW

;PASCOM
;SUBROUTINE TO PASS COMMENT, IF ANY.
;IF TRM=;, IGNORE INPUT TO EOL.
;DO IT BY FIELDS FOR CONSISTENT BEHAVIOR OF EDITING CHARACTERS.
;BUT LEAVE AC'S SET FOR PRECEDING FIELD.

PASCOM:	TRNN Z,CTRLVF		;I'VE FORGOTTEN WHY ↑V; DOESN'T COUNT
	CAIE TRM,";"
	RET		;NO COMMENT
	PUSH P,.BFP
	PUSH P,CNT
	PUSH P,CHR
	PUSH P,TRM
	PUSH P,CBT
PASCM1:	CALL CSTR
	CAIN TRM,FORMF
	JRST .+3
	CAIE TRM,EOL
	JRST PASCM1
	POP P,CBT
	POP P,TRM
	POP P,CHR
	POP P,CNT
	POP P,.BFP
	RET

;SERVICE ROUTINE FOR "ALLOW" UUO.
;CHECKS THAT LAST CHARACTER (USUALLY FIELD TERMINATOR) IS AS
;DESCRIBED BY BITS IN EFFECTIVE ADDRESS.
;IE MAKES SURE E OR'D WITH C(CBT) >< 0.

%ALLOW:	TRNN CBT,@40
	JRST CERR
	RET
;CONF CONF2

;CONF
;CONFIRMATION AND COMMAND TERMINATION SUBROUTINE
;ALL COMMANDS, EVEN NON-CONFIRMATION ONES, SHOULD CALL THIS.

;USES KWV1,TRM AND DOES THE FOLLOWING:
; IF PROGX, THE THING (BEING RUN?) GETS THE REST OF THE COMMAND LINE
;  SO NO SCANNING FOR EOL'S ETC. IS PERMITTED.
; IF BAKFF ON, ERROR UNLESS CNT=1.
; IF TRM=; , INPUT CHARS TO EOL AND EXIT.
; IF NOCONF ON, TYPE EOL UNLESS TRM=EOL OR FORMFEED AND EXIT.
; IF TRM><EOL OR IF CONMAN ON, INPUT CHARACTERS TILL NON-SPACE.
; BUT IF BAKFF ON, FALL THRU WITHOUT INPUTTING CHARACTERS.
;   IF EOL, EXIT.
;   IF ; , INPUT CHARS TILL EOL AND EXIT.
;   IF ALT MODE AND "ALTCON" ON, TYPE CR AND EXIT.
;   ELSE ERROR: TYPE " ? " AND LET USER TRY AGAIN.
;   ANY CHARACTER PRECEDED BY ↑V GETS ERROR TREATMENT

CONF:	TLZE Z,EOLNEF		;IS THERE AN UNECHOED EOL?
	PRINT EOL		;YES, ECHO IT NOW
	TLNE KWV1,PROGX		;PASSING CONTROL TO A PROGRAM?
	 RET			;YES. IT GETS THE REST OF LINE
	TLNN KWV1,CONFRC
	JRST CONF2

;FORCED CONFIRMATION FOR CERTAIN COMMANDS: 
;ALWAYS TYPE "[CONFIRM:]" ON NEXT LINE AND REQUIRE EOL.
	CALL PASCOM		;CHEW UP COMMENT IF ANY (PRESERVES TRM)
	CAIN TRM,";"
	MOVEI TRM,EOL		;DONT INPUT COMMENT AGAIN AT "CONF7".
	TRNN CBT,TEOL		;NEED WE "RFPOS" HERE?
	PRINT EOL		;IF CARRIAGE ISN'T AT LEFT, PUT IT THERE
CONF2:		; ... CAUSES "[CONFIRM:]" TO BE TYPED BELOW.
;IF THERE IS A FIELD WHICH HAS BEEN INPUT BUT NOT USED, IT MUST BE NULL.
;(SUCH A FIELD CAN OCCUR IF COMMAND ENDS IN A NOISE WORD AND THE
; USER TERMINATES WITH SPACE AND OMITS THE NOISE, BUT POSSIBLY
; TYPES SOME OTHER GARBAGE.)
	TLNE Z,BAKFF		;UNUSED INPUT FIELD?
	JRST [	CAILE CNT,1
		JRST CERR	;NON-NULL, USER TYPED GARBAGE
		JRST .+1]
	CAIN TRM,";"
        JRST CONF7         	; ; AS LAST FIELD TERMINATOR.
        TLNE KWV1,NOCONF
	JRST [	TRNN CBT,TEOL
		PRINT EOL
                RET]
        MOVE CHR,TRM       	;(SHOULD BE THERE ANYWAY)
        TLNN KWV1,CONMAN+CONFRC       ;FLAGS SAY ALWAYS CONFIRM
	TRNN CBT,TEOL		;A CR ALWAYS ENDS THE CMND IF CONMAN OFF
	TLNE Z,BAKFF		;IF, UNUSED FIELD USE ITS TERMINATOR
	JRST CONF8
;CONF6 CONF7 CONF8 CONF9 CONFE CONFE1

;CONF...
;READ A CHARACTER TO CONFIRM COMMAND.
;FIRST TYPE " [CONFIRM:] " IF AT LEFT MARGIN. SHOULD ONLY HAPPEN IF
; CONMAN ON AND USER ENDED LAST FIELD WITH CR AND COMMAND
; DIDN'T JUST TYPE OLD FILE/NEW FILE.
	PUSH P,A
	PUSH P,B
	MOVE A,COJFN
	RFPOS			;READ FILE POSITION
	TLZ B,-1
	CAIG B,2
	TYPE < [Confirm] >
	POP P,B
	POP P,A
	CALL ALLBK		;SET BREAK SET TO ALL CHARACTERS
CONF6:	MOVE .BFP,BFP		;NEW FIELD PREVENTS INVALID EDITING
	SETZ CNT,		;...
	CALL CCHRI		;INPUT CHARACTER
	TRNE CBT,TSPC
	JRST CONF6		;IGNORE PRECEDING SPACES AND TABS
	MOVE TRM,CHR
CONF7:	CALL PASCOM		;IF ;, IGNORE CHARACTERS TIL EOL

CONF8:	TLNE Z,CTRLVF
	JRST CONFE		;↑V ALWAYS LOOSES
	TRNE CBT,TEOL		;EOL OR ; OR FORMFEED
	JRST CONF9		;SUCCESS
	CAIN CHR,ALTM
	JRST [	TLNN KWV1,ALTCON	;ALT MODE. OK AS TERMINATOR?
		JRST CONFE		;NO, TYPE " ? " AND RETRY
		PRINT EOL
		JRST CONF9]
	JRST CONFE

;CONFIRMATION SUCCESSFUL

CONF9:	TLZ Z,BAKFF		;REALLY MATTERS, EG, FOR "↑E PRINT"
	RET

;CONFIRMATION FAILURE
;ON "?" TYPE EXPLANATORY MESSAGE, RETYPE COMMAND, ALLOW RETRY

CONFE:	CAIG CNT,1
	CAIE CHR,"?"
	JRST CONFE1		;NOT "?"
	MOVE BFP,.BFP		;REMOVE THE "?" FROM THE COMMAND LINE
	ETYPE < Confirm with carriage return%Y>; %Y RETYPES COMMAND
	JRST CONF6		;GO INPUT CONFIRMATION CHARACTER AGAIN
CONFE1:	TYPE < ? >		;KEEP TRYING TILL HE TYPES ↑X OR ↑C.
	BTCHER			;STOP NON-CONVERSATIONAL JOB
	MOVE BFP,.BFP		;FORGET BAD CONFIRMATION CHAR (FOR ↑R)
	JRST CONF6		;GO TRY AGAIN
;TCONF TCONF1 TCONFC TCONFX TCONFR

;TCONF
;CONFIRMATION ROUTINE (LIKE CONF) INTENDED TO BE USED DURING COMMAND
;EXECUTION.  DIFFERS FROM CONF IN THAT IT IS TRANSPARENT TO MOST AC'S
;AND HAS SEPARATE CONFIRMATION AND NON-CONFIRMATION RETURNS.

;	CALL TCONF
;	RET +1:	NOT CONFIRMED (I.E. ↑X OR TUROUT)
;	RET +2:	CONFIRMED (CR, EOL, ETC.)

;NOTE THIS ROUTINE PROBABLY OUGHT TO BE IMPLEMENTED AS A SPECIAL CALL
;TO CONF, BUT HTAT REQUIRES SAVING INCREDIBLE AMOUNTS OF STATE
;(INCLUDING THE CONTENTS OF CSBUF!)

TCONF:	CALL DOECEO		;ENSURE CR WILL ECHO
	CALL ALLBK		;BREAK ON ALL TYPED IN CHARACTERS
	PUSH P,EOFDSP		;CALLER (LIST) MIGHT HAVE ITS OWN TRAP
	MOVEI A,CCHEOF		;ROUTINE TO HANDLE EOF
	MOVEM A,EOFDSP
TCONF1:	MOVE A,CIJFN
	CFIBF			;FLUSH TYPEAHEAD TO AVOID CONFUSION
	BIN			;GET CONFIRMATION CHARACTER
	CAIN B,177
	 JRST TCONFR		;RUBOUT
	CAIN B,"X"-100
	 JRST TCONFX		;↑X
	CAIN B,15		;CR, EXPECT TO SEE LF AFTER SO READ IT
	 BIN
	CAIE B,37
	CAIN B,12
	 JRST TCONFC		;EOL OR LF, CONFIRMATION
	TYPE < ? >		;SOMETHING ELSE, KEEP TRYING UNTIL
	JRST TCONF1		;USER TYPES EOL OR RUBOUT

TCONFC:	AOSA -1(P)		;HERE FOR CONFIRMATION EXIT
TCONFX:	TYPE <↑X
>
	POP P,EOFDSP		;RESTORE PREVIOUS EOF DISPATCH
	RET

TCONFR:	TYPE <XXX
>
	POP P,EOFDSP		;RESTORE PREVIOUS EOF DISPATCH
	RET
;SPRTR

;SPRTR
;TEST TERMINATOR (SEPARATOR) AND MAYBE READ AND TEST THE NEXT FIELD,
; TO DETERMINE WHETHER THERE'S A COMMA NEXT (R2), THE END OF THE
; COMMAND (R3), OR GARBAGE OR ANOTHER ARG WITHOUT A COMMA (R1).
;
;TYPICAL USES: AFTER "DIRECTORY" OR "TYPE", TO SEE IF THERE IS
; A COMMA TO INITIATE SUBCOMMAND INPUT, OR A FILE NAME ARG (NOT
; SEPARATED WITH COMMA), OR NEITHER; BETWEEN ARGS IN A LIST
; SEPARATED WITH COMMAS, AS IN SOME SUBCOMMANDS OF "CREATE".
;
;IN MORE DETAIL:
;  RETURN +1:
;    ALT MODE OR SPACE NOT FOLLOWED IMMEDIATELY BY COMMA, EOL, OR
;    ALT MODE, IE FOLLOWED BY SOME OTHER TERMINATOR, OR AN
;    ALPHANUMERIC FIELD.  BAKFF SET, READY TO PROCESS FIELD.
;
;  RETURN +2:
;    COMMA, PERHAPS PRECEDED BY SPACE OR ALT MODE.
;    READY TO INPUT SUBCOMMANDS OR NEXT ARG OF LIST.
;
;  RETURN +3:
;    EOL, SPACE-EOL, SPACE-ALT MODE, ALT MODE-EOL, OR 2 ALT MODES.
;    BAKFF SET EXCEPT IN EOL CASE, READY TO CALL "CONF".
;
;CAVEAT: DON'T CALL THIS FOR A COMMAND WITH "CONFRC" BIT SET,
;	BECAUSE IT CAN READ CONFIRMING CHARACTER BEFORE CONF HAS HAD
;	ITS CHANCE TO TYPE "[CONFIRM:]".

SPRTR:	TRNE CBT,TEOL
	AOS (P)		;EOL. R3.
	TRNE CBT,TCOM+TEOL
	JRST [	AOS (P)		;COMMA GETS R2.
		RET]
	ALLOW TSPC+TALT		;ERR IF CHAR NOT EOL, COMMA, SPACE, OR ALT MODE.
	CALL CSTR		;AFTER SPACE OR ALT MODE GET NEXT FIELD.
	CAIGE CNT,2		;NON-NULL, ALWAYS BACK UP AND GIVE R1.
	TRNN CBT,TCOM+TEOL+TALT		;ALSO BAKUP & R1 IF NOT COM, EOL, ALTM.
	JRST [	TLO Z,BAKFF
		RET]
	AOS (P)
	TRNE CBT,TCOM
	RET		;NULL, COMMA: R2 WITHOUT BACKUP.
	TLO Z,BAKFF		;NULL, ALT MODE OR EOL: BACK UP, R3.
	JRST [	AOS (P)
		RET]
;CCHRI CCHR1 CCHR8

;CCHRI
;INPUT A CHARACTER FOR COMMAND STRING INTO "CHR".
;RETURNS IN AC "CBT" THE CHARACTER'S WORD IN THE CHARACTER TABLE --
;   THIS CONTAINS DESCRIPTIVE BITS (SEE COMMENTS ABOVE "CHRTBL")
;STORES IN CBUF (POINTER CBP)
;EDITING CHARACTERS:
; ↑A  DELETE CHAR (CAN ONLY DELETE TO BEGINNING OF FIELD)
; ↑W  DELETE FIELD (CAN ONLY DELETE CURRENT ONE)
; ↑X  DELETE LINE (DOESN'T RETURN TO CALLER)
; ↑R  RETYPE LINE ? IF COLLECT FILE NAME IS COMPATIBLE.
; ↑V  GET ANOTHER CHARACTER AND RETURN IT EVEN IF ITS AN EDITING CHAR,
;       & RETURN "CTRLVF" ON.
;OTHER SPECIAL CHARACTERS:
; (  IF ECHOING OFF, TURN IT ON AND PRINT "(".
;	THIS KLUDGE IS NECESSARY BECAUSE NOISE WORD CAN BE TYPED IN
;	BEFORE PASSWORD.
;CALLERS MUST CLEAR CHARS-IN-FIELD COUNTER (CNT) AT BEGINNING OF EACH
;NEW FIELD.

CCHRI:	PUSH P,A
	PUSH P,B
	MOVEI A,CCHEOF
	MOVEM A,EOFDSP		;SETUP TO DETECT EOF ON COMMAND INPUT
	TLZ Z,CTRLVF		;SAY NO ↑V (YET) BEFORE THIS CHARACTER
;RETURN HERE AFTER PROCESSING SPECIAL CHARACTER
;GET CHARACTER INTO "CHR", BITS INTO "CBT", DISPATCH IF SPECIAL

CCHR1:	MOVE A,CIJFN		;INPUT SOURCE DESIGNATOR
	BIN			;INPUT CHARACTER TO B
	CAIN 2,12		;LF?
	MOVEI 2,EOL		;YES, MAKE LIKE EOL
	CAIN B,15		;REAL CR?
	JRST [	BIN		;YES, ASSUME LF FOLLOWING
		MOVEI 2,EOL		;AND REPLACE WITH EOL
		JRST .+1]
	MOVE CHR,B
	AOS TTYACF		;SAY THERE'S BEEN TTY ACTIVITY, SO JOB
		;WON'T GET AUTOLOGOUTED FOR LACK THEREOF
	MOVE CBT,CHRTBL(CHR) ;BITS WORD FROM CHARACTER TABLE
	TLNE Z,CTRLVF		;PRECEDED BY ↑V?
	JRST CCHR8		;YES, NO SPECIAL PROCESSING
	TLNE CBT,-1		;HAS A SPECIAL-CASE DISPATCH ADDR?
	JRST [	HLRZ B,CBT	;YES, DISPATCH.
		JRST (B)]
;NOT SPECIAL. CHECK FOR COMMAND TOO LONG, STORE CHARACTER.

CCHR8:	HRRZ B,BFP
	CAIL B,CBUFE
	ERROR <Command too long>
	AOJ CNT,
	IDPB CHR,BFP		;STORE CHARACTEB IN COMMAND BUFFER
	SETZM EOFDSP
	POP P,B
	POP P,A
	RET
;$CTRLH $CTRLA CTRLA1 CTRLA2 CTRLA3 $CTRLW CTRLW1 CTRLW2 $CTRLR $CTRLX $RUB

;CCHRI...
;ROUTINES FOR SPECIAL CHARACTERS

;PROCESS ↑H

$CTRLH:	PRINT " "		;THEN FALL INTO ↑A ROUTINE

;PROCESS ↑A

$CTRLA:	SKIPG CNT		;ANY DELETEABLE CHARACTERS?
	JRST [	CALL DING	;NO, RING BELL
		JRST CCHR1]	;INPUT ANOTHER CHARACTER
	PUSH P,A
	PUSH P,C
	MOVE A,COJFN
	GTTYP			;GET TERMINAL TYPE
	POP P,C
	POP P,A
	CAIN B,12
	 JRST CTRLA1		;SCOPE
	TRZ B,10
	CAIL B,4
	 CAILE B,5
	  JRST CTRLA2		;PRINTING TERMINAL
CTRLA1:	TLNE Z,NECHOF		;SCOPE
	 JRST CTRLA3		;DON'T BACKSPACE IF ECHOING IS OFF
	UTYPE [ASCIZ /λ λ/]	;PRINT BACKSPACE, SPACE, BACKSPACE
	JRST CTRLA3
CTRLA2:	PRINT "\"		;ECHO \
        LDB B,BFP
	TLNN Z,NECHOF		;DON'T PRINT IF ECHOING IS OFF
        CALL CCHRO        	;DELETED CHARACTER
CTRLA3:	CALL UBP		;BACK UP BFP AND CNT
	JRST CCHR1 		;GET ANOTHER INPUT CHARACTER

;PROCESS ↑W

$CTRLW:	SKIPG CNT
	JRST [	CALL DING	;NO FIELD TO DELETE
		JRST CCHR1]
	PUSH P,A
	PUSH P,C
	MOVE A,COJFN
	GTTYP			;GET TERMINAL TYPE
	POP P,C
	POP P,A
	CAIN B,12
	 JRST CTRLW1		;SCOPE
	TRZ B,10
	CAIL B,4
	 CAILE B,5
	  JRST CTRLW2		;PRINTING TERMINAL
CTRLW1:	TLNN Z,NECHOF		;SCOPE
	 UTYPE [ASCIZ /λ λ/]	;PRINT BACKSPACE, SPACE, BACKSPACE
	CALL UBP
        JUMPG CNT,CTRLW1
        JRST CCHR1 
CTRLW2:	UTYPE [ASCIZ /←/]
        CALL UBP
        JUMPG CNT,.-1
        JRST CCHR1 

;PROCESS ↑R

$CTRLR:	TLNE Z,NECHOF		;IS ECHOING OFF?
	JRST [	CALL DING	;YES
		JRST CCHR1]	;GO GET NEXT CHAR
	CALL DOECEO		;MAKE SURE EOL WILL PRINT
	SETZ CHR,
        MOVE B,BFP
        IDPB CHR,B      	;TERMINATE WITH 0
	PRINT EOL
	PRINT " "
        UTYPE CBUF      	;TYPE CR, SPACE, COMMAND BUFFER
	TLNE Z,NEOLF		;IF EOL ECHO SUPPRESSION IN EFFECT,
	CALL NOECEO		;CHANGE CCOC BACK SO EOL'S WON'T PRINT
        JRST CCHR1

;PROCESS ↑X

$CTRLX:	.$ERROR <↑X>;	XXX?

;PROCESS RUBOUT (LATER A PSI(?))

$RUB:	.$ERROR <XXX>		;.$ERROR MEANS NO CR FIRST, NO CLR INBUF
;$FORMF FORMF1 $EOL $DASH $CTRLV $CONT

;CCHRI...   ROUTINES FOR SPECIAL CHARACTERS...

;PROCESS ↑L (FORMFEED)

$FORMF:	CALL DOECEO		;MAKE EOL'S PRINT
	PRINT EOL		;ECHO CR-LF AFTER FORMFEED
		;ABOVE FAILS IF FORM FEED IS BACKED UP OVER: TWO EOL'S ECHOED.
		;DON'T THINK IT CAN HAPPEN. 5/14/70.
FORMF1:	TLNE Z,NEOLF		;IF EOL ECHO SUPPRESSION IN EFFECT,
	CALL NOECEO		;CHANGE CCOC SO EOL'S WON'T PRINT
	JRST CCHR8

;PROCESS EOL

$EOL:	TLNE Z,NEOLF		;EOL ECHOING SUPPRESSED?
	TLO Z,EOLNEF		;YES, SAY THERE IS AN UNECHOED EOL.
	JRST CCHR8

;PROCESS "-"

$DASH:	TLNE Z,DASHF		;"DASHF" MAKES IT NON-ALPHANUMERIC, AND THUS
	TRZ CBT,ALPHAN		;A TERMINATOR.  USED IN "LIST" SUBCMD "PAGES".
	JRST CCHR8

;PROCESS ↑V

$CTRLV:	TLO Z,CTRLVF		;INDICATE PRECEDED BY ↑V
	JRST CCHR1		;GO GET ANOTHER CHARACTER

;PROCESS CONTINUATION CHARACTER (&)

$CONT:	CALL DOECEO		;MAKE EOL'S PRINT
	PRINT EOL		;ECHO EOL-SPACE
	PRINT " "
	MOVE CBT,CHRTBL+" " ;RETURN BITS FOR SPACE
	MOVEI CHR,CONTCH		;STORE SPECIAL CHARACTER IN CBUF
	JRST FORMF1		;GO SUPPRESS EOL PRINTING IF FLAG ON & JRST CCHR8
		;"CONTCH" IS USED BECAUSE MUST STORE A SINGLE BYTE BUT
		;KNOW TO TRANSLATE IT TO 3 BYTES (&-EOL-SPACE) ON OUTPUT BY
		;↑A OR ↑R.
;UBP CCHEOF CCHEF1 CCHEF2 CCHEF3 CCHEF4

;SUBROUTINE TO BACK UP ONE CHARACTER IN COMMAND STRING.
;UN-INCREMENTS "BFP" AND "CNT".

UBP:    SOJ CNT,
        ADD BFP,[7B5]   	;UNCREMENT BYTE POINTER
        TLNE BFP,40B23  	;THIS FAILS FOR POINTERS TO BIT -1
        SUB BFP,[43B5+1]        ;(SUCH POINTERS SHOULD NEVER GET HERE)
        RET

;EOF WHILE READING COMMAND FILE
; THIS IS CALLED AT COMPUTE LEVEL, NOT PSI LEVEL

CCHEOF:	INTOFF
	GPJFN
	HLRZM 2,CRJFNI
	HRRZM 2,CRJFNO		;SAVE FOR * IN "RED" OR "DET" CMND
	MOVE 2,PRIMRY		;REVERT TO JFNS WE HAD AT ENTRY
	SPJFN
	MOVEI 1,100
	MOVEM 1,CIJFN
	MOVEI 1,101
	MOVEM 1,COJFN
CCHEF1:	TYPE <[Eof on command input file]>
	MOVE 1,CRJFNI
	CAIE 1,-1		;PREVIOUS INPUT WAS CONTROLLING TTY?
	SKIPL CREDIF		;WAS INPUT REDIRECTED?
	 JRST CCHEF2		;YES OR NO
	CLOSF
	 CALL SCREWUP
CCHEF2:	SETZM CREDIF		;SAY INPUT NOT NOW REDIRECTED
CCHEF3:	MOVE 1,CRJFNO
	CAIE 1,-1
	SKIPL CREDOF
	 JRST CCHEF4
	CLOSF
	 CALL SCREWUP
CCHEF4:	SETZM CREDOF
	INTON
	CALL RLJFNS		;RELEASE JFN'S
	JRST ERRET		;BACK TO MAIN LOOP (FOR NOW)
;%TYPE TYP1 TYP2 CTYPE %$TYPE $CTYPE %ALTYP

;SERVICE ROUTINE FOR OUTPUT STRING UUO ("TYPE" MACRO)
;       UTYPE [ASCIZ @TEXT@]

;AND
;SUBROUTINE TO TYPE STRING FOR BYTE PTR IN A (CTYPE)

%TYPE:  PUSH P,A		;UUO SERVICE ENTRY
        HRR A,40
        HRLI A,<POINT 7,0,-1>B53        ;FORM BYTE POINTER TO ARGUMENT
TYP1:   PUSH P,B
TYP2:   ILDB B,A
        JUMPE B,[POP P,B
                POP P,A
                RET]
        CALL CCHRO		;OUTPUT CHARACTER IN B
        JRST TYP2

CTYPE:  PUSH P,A		;SUBR ENTRY
        JRST TYP1

;SIMILAR BUT ALSO STORE TEXT IN COMMAND BUFFER.
;USE FOR NOISE WORDS & PRINTING REST ON ALT MODE, SO ↑R PRINTS IT ALL

%$TYPE:	PUSH P,Z		;UUO ENTRY
	TLO Z,STCF		;FLAG TELLS "CCHRO" TO STORE CHARACTERS
	CALL %TYPE
	POP P,Z		;RESTORE PREVIOUS STATE OF STCF
	RET

$CTYPE:	PUSH P,Z		;SUBROUTINE ENTRY
	TLO Z,STCF
	CALL CTYPE
	POP P,Z
	RET

;SIMILAR BUT ONLY DO IT IF TERMINATOR (IN AC "TRM") IS ALT MODE.
;USED TO TYPE REST OF RECOGNIZED WORD, SPACES BEFORE ARGUMENTS, ETC.
;MACRO "ALTYPE", UUO "UALTYP".

%ALTYP:	CAIN TRM,ALTM
	JRST %$TYPE
	RET

;SEE ALSO "%ETYPE" IN S3.MAC
;COLLECT FILE NAMES:
;CINFN & COUTFN & SPECFN & CPFN & .INFG & INFG & DIRARG & SO ON.
;VARIOUS ENTRIES FOR INPUT, OUTPUT, SPECIAL CASE, & GROUP DESCRIPTORS.
;CAN INPUT LIST OF NAMES SEPARATED BY COMMAS AS WELL AS *.MAC FORMS.

;TAKE: A: RH: 0, 2, OR DEFAULT EXTENSION POINTER
;	      2 => USE LAST NAME INPUT AS DEFAULT NAME
;         LH: 0, -1, -2, 1, 2, OR DEFAULT NAME POINTER
;	      0 => RETURN +1 IF NULL, PRINTING "-" ON ALT MODE
;	      1 => LIKE 0 BUT ALSO RETURN +1 IF "*" INPUT
;	      2 => LIKE -1 BUT USE EXT OF LAST FILE NAME INPUT AS
;		   DEFAULT EXT
;	      -1=> GIVE INPUT TO GTJFN EVEN IF NULL OR *
;	      -2   LIKE -1 BUT GIVE R1 IF NO SUCH FILE
;    ALSO ENTRY "SPECFN" TAKES IN B: LH: DEFAULT VERSION (USUALLY 0)
;	RH: FLAGS FOR GTJFN PLUS:
;	    B15: ALLOW GROUP OF NAMES, ALL BUT LAST TERMINATED WITH ",".
;		 DOES NOT HANDLE ALTMODE-COMMA (USE ↑F FOR RECOGNITION),
;		 MAY THUS BE USED WHERE A NOISE WORD, ETC FOLLOWS (COPY)
;	    B16 & B17 ARE HAIRY: THE CASUAL READER SHOULD DISREGARD
;			 THEM.
;	    B16: ALLOW GROUP OF NAMES SEPARATED BY SPACE, ALTMODE, OR
;		 SPACE-COMMA OR ALTMODE-COMMA. IF LAST COMMA IS FOLLOWED
;		 BY ALTMODE OR EOL, GIVE R1 (TO INDICATE SUBCOMMAND
;		 INPUT REQUIRED).
;		 B15 SHOULD ALSO BE ON.
;		 ONLY USEABLE IF LIST IS LAST THING IN COMMAND; CAN
;		 PRE-READ FOLLOWING FIELD HENCE WONT WORK WITH "CONFRC".
;	    B17: DEFAULTS NULL WITHOUT LETTING THE USER BE AWARE
;		 OF THIS (NO PRINTOUT, RETURN WITH BAKFF ON IF IT
;		 WAS ALT MODE).
;			EG "DIRECTORY$$" AND "DIRECTORY$ *.*$$" ARE =.
;		 ALSO IF AT ENTRY PRECEDING FIELD ENDED IN COMMA OR EOL,
;		 BEHAVE AS THO THAT CHARACTER WERE INPUT HERE &
;		 DEFAULT ACCORDINGLY.
;			EG "DIRECTORY,$", "DIRECTORY ,$" ARE SAME.

;	    B14: ALLOW * FOR NAME IN EMPTY DIRECTORY, RETURNING -2
;		 IN PLACE OF JFN.
;		 (NOT WORKING 2/9/71 CAUSE GJFX32 NOT WORKING.)
;
;
;    ALSO, F3 IN Z  SAYS TO DEFAULT DIRECTORIES TO CONNECT AND LOGIN
;	AFTER INITIAL TRY FAILS --  FOR DEFAULT RUN
;COLLECT FILE NAMES COMMENTS...

;RETURN: +1: NULL INPUT AND 0 OR 1 IN LH OF A, OR "-" INPUT,
;		OR "*" INPUT AND 1 IN LH OF A (INDICATED BY "*" IN A),
;		OR TRM=EOL AT ENTRY (IN WHICH CASE NO INPUT),
;		OR -2 IN LH OF A AND NO SUCH FILE,
;		OR B16 ON AND LIST ENDED WITH COMMA.
;		THE FIRST 3 OF THESE RETURN +1 OPTIONS SHOULDN'T
;		BE USED IF B15, B16, OR B17 ON.
;	 +2: SUCCESS, JFN IN A AND ALSO STACKED IN BUFFER "JBUF"
;		(POINTER JBUFP). 1ST LOCATION IN THIS BUFFER
;		(FIRST JFN IN COMMAND) CAN BE ADDRESSED AS CJFN1,...
;		IF AN INPUT GROUP DESCRIPTOR COULD HAVE BEEN INPUT
;		(B11,15,16,OR 17 ON), SETS INIFH1 &2 TO 1ST & LAST USED
;		LOCS IN JBUF, RETURNS FIRST JFN IN A, AND SETS "GROUPF"
;		IF A GROUP WAS SPECIFIED (* OR MORE THAN 1 NAME INPUT).

;	 EITHER: TERMINATOR IN "TRM"
;ASSUME NULL INPUT IF LAST TERMINATOR=EOL AND BAKFF OFF,
; AS %KEYW DOES.  SEE %KEYW'S GLITCH NOTE (S1.MAC).

;FLAGS IN AC D
;RH: FROM CALLER
;LH: B0: NULL INPUT UNDER B17 OPTION
;    B1: B16 ON, ALREADY AT LEAST ONE ARG, NOT FOLLOWED BY COMMA
;    B2: DITTO, DITTO, FOLLOWED BY COMMA
;COUTFN CINFN CEDFN

;COLLECT FILE NAMES...  ENTRIES.

;OUTPUT FILE NAME ENTRY (OLD OR NEW NAME).
;PRINTS WHETHER OLD OR NEW, NO CONFIRMATION.

COUTFN:	PUSH P,B
	MOVEI B,440000		;GTJFN FLAGS FOR OUTPUT FILE NAME
	JRST CFN1

;INPUT (OLD FILE REQUIRED)

CINFN:	PUSH P,B
	MOVEI B,100000		;FLAGS FOR GTJFN FOR INPUT FILE
	JRST CFN1

;EDIT FILE NAME -- MAY OR MAY NOT EXIST YET

CEDFN:	PUSH P,B
	MOVE A,EDFILE		;POINTERS TO DEFAULT NAME AND EXT.
;	MOVEI B,B3+B4		;PRINT NEW/OLD, CONFIRM, NO SPEC OPTIONS
	MOVEI B,120000
	JRST CFN1


;THE NEXT FOUR ENTRIES INPUT AN INPUT FILE GROUP.
;ALL PERMIT *'S AND ADDITIONAL NAME AFTER ONE TERMINATED BY COMMA.
;NO SPECIAL RETURN FOR "*" OR NULL INPUT.
;THESE EXEMPLIFY USE OF GROUP FEATURES, OTHERS POSS USING "SPECFN".
;.INFG .INFG1 INFG $INFG DIRARG

;COLLECT FILE NAMES...   GROUP ENTRIES

;.INFG
;ACCEPTS COMMAS ONLY IF THEY TERMINATE FILE NAME - 
; THUS ↑F MUST BE USED FOR RECOGNITION IF COMMA IS TO FOLLOW.
;SUITABLE FOR USE WHERE ADDITIONAL FIELDS OF COMMAND FOLLOW,
; AS IN 1ST ARG TO "COPY".
;NAME AND EXT DEFAULT TO LAST INPUT (THUS NONE FOR 1ST IN GROUP),
; VERSION TO HIGHEST.
;ONE RETURN ONLY.

.INFG:	PUSH P,B
	MOVEI B,B2+B11+B15	;GTJFN & LOCAL FLAGS: OLD FILES,
				;*'S FOR INPUT, MINIMUM COMMA OPTION.
.INFG1:	MOVE A,[XWD 2,2]
	CALL SPECFN
	 JRST CERR
	JRST [	POP P,B
		RET]

;INFG
;SIMILAR BUT ALSO ALLOWS COMMAS AFTER ALTMODE OR SPACE AND
; ADDITIONAL NAMES WITHOUT COMMA AFTER ALTMODE OR SPACE.
;SUITABLE FOR USE ONLY AT END OF COMMAND, AS WITH "LIST".
;WARNING: CAN PRE-READ CONFIRMATION CHARACTER.

INFG:	PUSH P,B
	MOVEI B,B2+B11+B15+B16
	JRST .INFG1

;$INFG
;SIMILAR TO ABOVE EXCEPT RETURNS +1 IF LIST ENDED WITH COMMA NOT
;FOLLOWED BY ANOTHER NAME (TO INDICATE SUCCOMMAND INPUT).

$INFG:	PUSH P,B
	MOVEI B,B2+B11+B15+B16
	MOVE A,[XWD 2,2]
	JRST CFN1

;DIRARG
;FANCIEST INPUT GROUP, LIKE ABOVE EXCEPT:
; DEFAULTS NAME, EXT, VERSION TO "*". ALLOWS DELETED FILE NAMES (UG!).
; IF PRECEDING FIELD ENDED WITH COMMA OR EOL, OR IF A NULL ARG IS
; SEEN, SUPPLIES DEFAULT ARG "*.*;*" BUT HIDES THIS FROM USER.
; ACCEPTS * FOR NAME IN EMPTY DIRECTORY

DIRARG:	PUSH P,B
	MOVE A,[XWD [ASCIZ /*/],[ASCIZ /*/]]
	HRLI B,-3		;DEFAULT VERSION: *
	HRRI B,B2+B8+B11+B14+B15+B16+B17
	JRST CFN1
;SPECFN CFN1 CFN1A CFN1B

;COLLECT FILE NAMES ENTRIES...

;ENTRY FOR GTJFN FLAGS IN RH OF B, DEFAULT VERSION (NORMALLY 0) IN LH.
; USED IN SPECIAL CASES, EG:
;	DEFAULT TO LOWEST VERSION FOR "DELETE" (-2 IN LH B)
;	DELETED FILE NAME FOR "UNDELETE"
;	NEW NAME FOR "DEFINE"
;	ANYWHERE *'S ARE ALLOWED, AS IN "DIRECTORY".

SPECFN:	PUSH P,B

;END OF ENTRIES.  CASES MERGE HERE.

CFN1:	SETZM CJFNBK+3		;NO DEFAULT DIRECTORY
CFN1A:	PUSH P,C		;"CPFN" SETS DEFAULT DIR AND JOINS HERE.
	PUSH P,D
	HRRZ D,B		;SAVE GTJFN AND LOCAL FLAGS IN RH D
		;NOTE: B0 OF LH D USED AS A FLAG IN CONJUNCTION WITH
		;NULL INPUT UNDER B17 OPTION
	TRZ B,B15+B16+B17	;DON'T GIVE LOCAL FLAGS TO GTJFN
	TRNE D,B11+B15+B16+B17	;IF AN INPUT GROUP IS BEING REQUESTED,
	SETZM INIFH1		;SAY NO NAMES HAVE BEEN INPUT YET.
	TRNE D,B17
	TRNN CBT,TCOM+TEOL
	JRST CFN1B
	TLOE Z,BAKFF
	JRST CFN1B
		;B17 OPTION ON AND LAST FIELD ENDED IN COMMA OR EOL.
		;BEHAVE AS THO FIRST INPUT FIELD WAS JUST THAT CHARACTER
	MOVE .BFP,BFP
	CALL UBP		;UNINCREMENT BFP
	EXCH .BFP,BFP		;SET UP PTRS TO TERMINATOR ONLY
	MOVEI CNT,1		;NULL FIELD. BAKFF ALREADY ON.
	MOVEI C," "
	TRNE CBT,TEOL		;CHANGE EOL TO SPACE SO GTJFN WON'T
	DPB C,BFP		;"ECHO" EXTRA CR
CFN1B:	TLNE Z,BAKFF		;IF THERE'S AN UNUSED FIELD,
	JRST .+3		;THEN THE COMMAND HASN'T ENDED.
	TRNE CBT,TEOL		;LAST TERMINATOR CR OR ; ?
	JRST CFN9		;YES, IT ENDED COMMAND, NO MORE INPUT
;CFN2

;COLLECT FILE NAMES...
;SET UP GTJFN PARAMETER BLOCK
	MOVSM B,CJFNBK		;FLAGS AND DEFAULT VERSION
	MOVE B,COJFN
	HRL B,CIJFN
	MOVEM B,CJFNBK+1		;XWD INPUT JFN, OUTPUT JFN
;COME BACK HERE TO GET ANOTHER FILE NAME IN GROUP

CFN2:	TLZ D,B0
; FORM "DEFAULT STRING POINTER" TO EXTENSION
	HRRZ B,A
	HRLZI C,B11		;ARGUMENT FOR LFJFNS: EXT ONLY, NO PUNCT
	CAIN B,2		;2 SAYS USE EXT OF LAST FILE NAME INPUT
	CALL LFJFNS		;GET A STRING FOR LAST FILE'S EXT
	JUMPE B,.+2
	HRLI B,<POINT 7,0,-1>B53
	MOVEM B,CJFNBK+5
; FORM "DEFAULT STRING POINTER" TO DEFAULT NAME
	HLRZ B,A
	HRLZI C,B8		;ARGUMENT FOR LJFNS: NAME ONLY, NO PUNCT
	CAIN B,2		;2 SAYS USE NAME OF LAST FILE NAME INPUT
	CALL LFJFNS		;GET A STRING FOR LAST FILE'S NAME
	CAIE B,-2
	CAIN B,-1
	SETZ B,
	JUMPE B,.+2
	HRLI B,<POINT 7,0,-1>B53
	MOVEM B,CJFNBK+4
;CFN3 CFN3A CFN3B

;COLLECT FILE NAMES...
;NOW WE MUST READ TEXT UP TO A FILE NAME FIELD TERMINATOR,
; TO ALLOW EDITING, THEN CHECK FOR SPECIAL CASES: NULL, "-", AND "*".
;RETURN HERE TO RETRY AFTER ERROR RETURN FROM GTJFN.

CFN3:	TLO Z,PUNCF+NEOLF ;SAY READ INPUT TO FILE FIELD TERMINATOR
		;AND DON'T ECHO EOL (BECAUSE GTJFN PRINTS EOL
		;WHEN APPROPRIATE EVEN IF IT WAS PRE-READ).
	INHELP <File name>	;INPUT FIELD, TYPE MESSAGE ON "?"
	TRNN CBT,TSPC+TALT+TEOL+TCOM
	JRST CFN4	;END OF FIELD, NOT WHOLE NAME, NOT SPEC CASE
	CAIE CNT,1
	JRST CFN3B
		;NULL CASE
		;NULL INPUT TERMINATING LIST UNDER B16 OPTION IS PROCESSED
		;HERE RATHER THAN AFTER GTJFN FOR CORRECT BEHAVIOR AFTER ERROR:
		;IE BAD FILE NAME TYPES "?", THEN IF JUST A CR IS INPUT,
		;PRECEDING LIST IS PROCESSED AS THO IT WAS TERMINATED BY THE CR.
	TRNN CBT,TALT+TEOL
	JRST .+5		;ANOTHER COMMA DOESN'T END LIST
	TLNE D,B2		;B16 & PREV FIELD ENDED WITH COMMA?
	SOSA -3(P)		;YES, CANCEL AOS BELOW TO GIVE R1 AFTER
		;GOING THRU GOOD RETURN CODE
	TLNE D,B1		;B16 & NO COMMA AFTER PREV ARG?
	JRST [	PUSH P,A	;YES. INTERFACE TO EXIT CODE AT "CFN7Z"
		CAIN TRM,ALTM	;..  DON'T BUFFER ALT MODES, CAUSE
		CALL UBP	;..  OTHERWISE "ALTYPE ( )" SETS CNT TO
				;    2 AND "CONF" GIVES AN ERROR.
		TLO Z,BAKFF	;RE-USE ALTM OR EOL AS CONFIRMING CHAR
		JRST CFN7Z]
	TRNE D,B17		;B17 OPTION (SEE COMMENTS AT BEGINNING) 
	TRNN CBT,TALT		;YES, NULL ONLY SPECIAL IF ALTMODE
	JRST CFN3A
	MOVEI B," "
	DPB B,BFP		;SUPPRESS PRINTOUT OF DEFAULT
	TLO D,B0		;INVOKE ADDL SPECIAL STUFF AFTER GTJFN
	JRST CFN4
CFN3A:	TLNE A,-2		;DID CALLER GIVE A DEFAULT NAME,
				;OR -1 TO SAY "NO SPEC CASE FOR NULL"?
	JRST CFN4		;YES, GO GTJFN
	UALTYP [ASCIZ /-/]		;NO. PRINT "-" IF ALT MODE.
	JRST CFN9		;RETURN +1
CFN3B:	CAIN CNT,2
		;ONE-CHARACTER CASE
	JRST [	MOVE B,.BFP		;GET THE ONE CHARACTER
		ILDB B,B		;...
		CAIN B,"-"		;WAS IT "-"?
		JRST CFN9		;YES, RETURN +1.
		CAIE B,"*"		;WAS IT ASTERISK?
		JRST .+1		;NO, NOT SPECIAL, GO GTJFN.
		HLRZ B,A		;YES, DID CALLER REQUEST SPECIAL
		CAIE B,1		;...HANLDING OF ASTERISK?
		JRST .+1		;NO.
		MOVEI A,"*"		;YES, RETURN +1 WITH "*" IN A.
		JRST CFN9]
;CFN4 CFN4X CFN4Y CFN4Z

;COLLECT FILE NAMES...
;HERE WHEN EXCEPTIONS ELIMINATED AND MUST "GTJFN"

CFN4:	PUSH P,A		;SAVE FOR ERROR RETRY
	HLRZ B,JBUFP		;CHECK SPACE IN JFN BUFFER
	CAIN B,-1
	ERROR <Too many JFN's in command>
	MOVEI A,CJFNBK		;GTJFN PARAMETER BLOCK LOCATION
	MOVE B,.BFP		;POINTER TO STRING INCLUDING TERMINATOR
	GTJFN		;GET JFN FOR NAME. TAKES MORE INPUT FROM
		; COMMAND FILE (TTY) IF NEEDED.
	CAIA			;1: FAILLED: TRY F3
	JRST CFN4Z		;SUCCESS
	TLNN Z,F3		;IF F3, THEN TRY AGAIN USING
				; FIRST THE CONNECTED DIRECTORY
				; AND NEXT THE LOGIN DIRECTORY
				;  USED FOR SUBSYSTEM NAME COMMAND
				;   IF STILL FAILS OR IF NOT F3
				;   THEN CALL CFNE TO ADJUST PC FOR JERR
	JRST CFN4Y
	PUSH P,D
	GJINF			;GET CONNECTED DIRECTORY
	POP P,D
	CAMN 1,2		;EQUALS LOGIN DIRECTORY?
	JRST CFN4X		;YES
	HRROI A,IUSRNM		;GET DIRECTORY STRING
	DIRST
	 CALL [	SKIPG CUSRNO	;LOGGED-IN?
		JRST CERR
		JRST SCREWUP]	;YES, REAL SCREWUP
	MOVEI A,CJFNBK		;LONG GTJFN BLOCK
	HRROI B,IUSRNM		;NEW DEFAULT DIRECTORY
	MOVEM B,3(A)
	MOVE B,.BFP		;STRING POINTER FOR INPUT SO FAR
	GTJFN
	 CAIA			;FAILED AGAIN, TRY LOGIN DIRECTORY
	JRST CFN4Z		;SUCCESS
	PUSH P,D
	GJINF
	POP P,D
CFN4X:	MOVE B,A
	HRROI A,IUSRNM
	DIRST			;GET DIRECTORY STRING
	 CALL [	SKIPG CUSRNO
		JRST CERR
		JRST SCREWUP]
	MOVEI A,CJFNBK		;LONG GTJFN BLOCK
	HRROI B,IUSRNM		;NEW DEFAULT DIRECTORY
	MOVEM B,3(A)
	MOVE B,.BFP		;INPUT STRING SO FAR
	GTJFN			;TRY AGAIN
CFN4Y:	 CALL CFNE		;ADJUST PC FOR JERR
CFN4Z:	MOVE B,JBUFP		;ADD JFN TO STACK. MUST HAPPEN PROMPTLY
	PUSH B,A		;SO IT WILL GET RELEASED ON ERRORS.
	MOVEM B,JBUFP


;PUT FILE NAME TEXT (UNFORTUNATELY NOT NECESSARILY AS INPUT)
; INTO COMMAND STRING BUFFER, FOR ↑R.
	MOVE B,A		;JFN
	MOVE A,.BFP		;DEST: OVERWRITE WHAT WAS PRE-READ
	SETZ C,			;DEFAULT FORMAT
	CAME B,[-2]		;NULL TEXT FOR EMPTY DIRECTORY
	JFNS			;JFN TO STRING CONVERSION
	MOVE BFP,A		;NEW END OF COMMAND STRING
	CALL INTRM		;GET TERMINATING CHR OF FIELD GTJFN READ
	MOVE A,B		;JFN TO A TO RETURN
;CFN7A CFN7B

;COLLECT FILE NAMES...
;CODE FOR THE VARIOUS GROUP CASES
	TRNN D,B11+B15+B16+B17
	JRST CFN8		;NO SUCH OPTIONS ON
	TLZE D,B1+B2		;B16 AND NOT FIRST ARG?
	TLO Z,GROUPF		;YES, SAY GROUP INPUT.
	HRRZ B,JBUFP
	SKIPN INIFH1		;FIRST JFN IN GROUP?
	MOVEM B,INIFH1		;YES, SAVE JBUF POINTER
	TLNE A,<77B5>B53		;ANY *'S INPUT OR DEFAULTED TO?
	TLO Z,GROUPF		;YES, SAY GROUP WAS SPECIFIED.
	TLNN D,B0		;WAS IT ALTMODE ONLY & B17 OPTION ON?
	JRST CFN7A		;NO
		;AFTER ALTMODE TO B17 OPTION RETURN IMMEDIATELY
		;WITH BAKFF ON SO THE ALT MODE FUNCTIONS AS CONFIRMATION CHAR
	TLO Z,BAKFF
	JRST CFN7Z
CFN7A:	TRNE D,B15
	CAIE TRM,","
	JRST CFN7C
		;COMMA TERMINATOR AND B15 ON
	HLRZ A,JBUFP		;JFN LIST PUSH POINTER
	CAIN A,-2
	 JRST [	UTYPE [ASCIZ /[File list full]/]
		MOVEI 1,↑D500
		DISMS
		MOVEI 1,100
		CFIBF
		MOVEI TRM,33	;FAKE ALTMODE AS TERMINATOR
		MOVEI CBT,TALT
		JRST CFN7Z]	;AND GET OUT
	TRNE D,B16
	JRST CFN7D
		;GO GET NEXT ARGUMENT OF LIST
	TLO Z,GROUPF		;SAY A GROUP HAS BEEN INPUT
CFN7B:	POP P,A		;RESTORE CALLER'S A
	JRST CFN2		;GO RESETUP DEFAULTS AND READ ANOTHER ARG
;CFN7C CFN7D CFN7Z

;COLLECT FILE NAMES...  GROUP CASES CODE...

CFN7C:	TRNE CBT,TALT+TSPC
	TRNN D,B16
	JRST CFN7Z
		;ALTMODE OR SPACE TERMINATOR AND B16 ON.
		;PREREAD NEXT FIELD AND CHECK FOR COMMA.
	ALTYPE ( )
	HLRZ A,JBUFP		;FILE LIST PUSH POINTER
	CAIN A,-2
	 JRST [	UTYPE [ASCIZ /[File list full]/]
		MOVEI 1,↑D500
		DISMS
		MOVEI 1,100
		CFIBF
		JRST CFN7Z]
	TLO Z,NEOLF
	CALL CSTR
	CAIE CNT,1
	JRST .+3		;NON-NULL, ITS ANOTHER ARG
	TRNE CBT,TCOM
	JRST CFN7D		;NULL, COMMA, IS SEPARATOR, DONT REUSE
	TLO Z,BAKFF		;SAY RE-USE FIELD
	TLOA D,B1		;SAY B16 AND NO COMMA & GET NEXT ARG
		;B16 ON AND COMMA SEEN.
CFN7D:	TLO D,B2		;SAY B16 AND COMMA SEEN
	JRST CFN7B		;GO GET NEXT ARG OR TERMINATE LIST ON NULL
CFN7Z:	HRRZ B,JBUFP
	MOVEM B,INIFH2		;RETURN JBUFP VALUE FOR LAST NAME IN GROUP
	MOVE A,@INIFH1		;RETURN FIRST, NOT LAST, JFN IN A
;CFN8 CFN9 CFN9A

;COLLECT FILE NAMES...
;END OF GROUP CASES CODE. RETURN.

CFN8:	POP P,B			;THROW AWAY JUNK. JFN TO RETURN IS IN A
	AOS -3(P)		;+2
CFN9:	TLZE Z,EOLNEF		;IF THERE'S UNECHOED EOL,
	 JRST [	MOVE B,CJFNBK	;GET GTJFN BITS
		TLNN B,(1B3)	;WAS CONFIRMATION MESSAGE PRINTED?
		 PRINT EOL	;NO, ECHO EOL NOW
		JRST CFN9A]
	ALTYPE ( )		;TYPE SPACE IF IT ENDED WITH ALT MODE
CFN9A:	POP P,D
	POP P,C
	POP P,B		;+1
	RET
;CFNE

;COLLECT FILE NAMES...
;GTJFN ERROR RETURN PUSHJ'S HERE WITH ERROR CODE IN A.
;MOST ERRORS ARE FILE NOT FOUND OR SELF-EVIDENT SYNTAX ERRORS.
; FOR THOSE TYPE " ? " AND REPEAT GTJFN.
;FIRST TEST ERROR CODE FOR EXCEPTIONS.

CFNE:	CAIN A,GJFX3
	ERROR <No JFN's available: you must close some files first>
	CAIN A,GJFX22
	ERROR <JSB full: try closing some files then repeating command>
	CAIN A,GJFX23
	ERROR <Directory full: can't create new files until you
 DELETE some files and EXPUNGE>
	CAIN A,GJFX27
	ERROR <New file name required>
	CAIN A,GJFX28
	ERROR <Device not mounted>
	CAIN A,GJFX29
	ERROR <Device assigned to another job>
	CAIN A,GJFX31
	ERROR <Bad use of *>
	CAIN A,GJFX32
	JRST [		;IF FLAG B14 ON GIVE GOOD RETURN WITH -2 INSTEAD
		;OF JFN WHEN GJFX32 ERROR OCCURS.
		;USED FOR "DIRECTORY" (DIRARG).
		TRNN D,B14
		UERR [ASCIZ /No files in that directory/]
		HRROI A,-2
		RET]		;RETURNS TO LOC(GTJFN) +2
	SUB P,[XWD 1,1]		;DISCARD PC SAVED FOR JERR (NOT USED 6/29/70)
	TLZ Z,EOLNEF		;DON'T ECHO ANY "UNECHOED" EOL (GTJFN DID IT)
	PUSH P,.BFP
	CALL INTRM		;GET TERMINATOR
	HLRZ A,-1(P)		;MOST GTJFN ERRORS RETURN +1 IF CALLER GAVE
	CAIN A,-2		;... -2 IN LH OF A.
	JRST [	POP P,.BFP		;(THIS FEATURE USED ONLY FOR
		POP P,A		; CPFN. 4/30/70)
		JRST CFN9]		;RETURN +1.
	TRNE CBT,TEOL
	JRST CERR		;NO RETRY AFTER CARRIAGE RETURN
	TYPE < ? >;
	MOVEI 1,↑D500
	DISMS
	MOVEI 1,100
	CFIBF
	POP P,BFP		;OLD .BFP VALUE: CLEAR NAME FROM BUFFER
	POP P,A
	BTCHER		;STOP NON-CONVERSATIONAL JOB
	JRST CFN3
;INTRM

;INTRM
;GET TERMINATOR AFTER GTJFN, ETC, BY RE-READING CHARACTER.

INTRM:	PUSH P,A
	MOVE A,CIJFN
	BKJFN		;"UN-INPUT" IT
	 CALL JERR
	POP P,A
	MOVE .BFP,BFP		;INITIALIZE FIELD TO PREVENT EDITING
	SETZ CNT,		;(PROBABLY UNNECESSARY)
	CALL CCHRI		;READ CHARACTER
	CAIN CHR,ALTM
	CALL UBP		;DON'T BUFFER ALT MODES
	MOVE TRM,CHR
	RET
;LFJFNS LFJF9

;LFJFNS: SUBROUTINE FOR CINFN, COUTFN, SPECFN.
;DO A JFNS FOR MUST RECENT PREVIOUSLY INPUT FILE NAME, USING
; JFNS FORMAT SPECIFICATION IN C.
;RETURNS IN B: POINTER TO LEFT-ADJUSTED STRING
;IF LAST JFN NOT ON A DIRECTORY DEVICE, OR NO PREVIOUS JFN FOR THIS
; COMMAND, RETURNS 0 IN B.

LFJFNS:	PUSH P,A
	HRRZ B,JBUFP		;JFN STACK POINTER
	CAIN B,JBUF-1		;HAS A NAME BEEN INPUT YET?
	JRST LFJF9		;NO, GO RETURN 0 POINTER
	HRRZ A,(B)		;PICK UP JFN OF LAST NAME INPUT
	CAIN A,-1
	JRST LFJF9		;-1 ISN'T A JFN BUT MIGHT GET HERE
	PUSH P,C
	DVCHR		;GET DEVICE CHARACTERISTICS FOR JFN
	POP P,C
	TLNN B,B2
	JRST LFJF9		;NOT A DIRECTORY DEVICE, RETURN 0
	HRRZ A,CSBUFP		;STRING BUFFER POINTER RH
	ADD A,[POINT 7,1,-1]		;BEGINNING OF NEXT WORD
	MOVEM A,CSBUFP
	MOVE B,JBUFP
	MOVE B,(B)		;PICK UP JFN AGAIN
	JFNS		;DO THE JFN TO STRING CONVERSION
	SETZ B,
	IDPB B,A		;APPEND NULL TO STRING
	EXCH A,CSBUFP		;UPDATE BUFFER PTR, GET STRING BEGINNING
	SKIPA B,A		;RETURN STRING POINTER IN B
LFJF9:	SETZ B,		;RETURN 0 IF CAN'T RETURN A STRING
	POP P,A
	RET
;CPFN

;CPFN: COLLECT PROGRAM FILE NAME
;TAKES: A: 0 OR WORD POINTER TO DEFAULT DIRECTORY NAME.
;NO DEFAULT NAME, DEFAULT EXTENSION ALWAYS ".SAV".
;RETURNS +1 ON GTJFN FAILURE.

CPFN:	PUSH P,B
	MOVEI B,100000
	JUMPE A,.+2
	HRLI A,<POINT 7,0,-1>B53	;IF NON-0, FILL OUT BYTE PTR
	MOVEM A,CJFNBK+3		;DEFAULT DIRECTORY
	HRRI A,[ASCIZ /SAV/]		;DEFAULT EXT
	HRLI A,-2		;SAY RETURN +1 ON GTJFN FAILURE
	JRST CFN1A		;JOIN CINFN & COUTFN
;TYPIF GNFIL GNFIL3 GNFIL5 GNFIL8

;TYPIF: TYPE NAME OF CURRENT FILE IN INPUT FILE GROUP
; BUT NOT IF NOT A GROUP (IE ONLY ONE NAME AND NO *'S INPUT)
;RETURNS JFN IN A

TYPIF:	HRRZ A,@INIFH1		;GET CURRENT JFN
	TLNE Z,GROUPF		;SKIP IF NON-GROUP
	ETYPE < %1S
>;		;%S: TYPE NAME FOR JFN
	RET

;GNFIL
;GET NEXT INPUT FILE OF GROUP WHICH MAY CONTAIN *'S OR MULTIPLE NAMES.
;R1 IF NO MORE FILES. R2 WITH NEXT JFN IN A.
;CLOSES PREVIOUS FILE IF OPEN. DOESN'T RELEASE JFN (RLFJNS DOES THIS).

GNFIL:	PUSH P,A
	PUSH P,B
	HRRZ A,@INIFH1
	GTSTS
	JUMPGE B,GNFIL3		;JUMP IF NOT OPEN
	TLO A,B0		;SAY DON'T RELEASE JFN
	CLOSF
	 CALL JERR
GNFIL3:	MOVE A,@INIFH1
	TLNN A,<77B5>B53	;NO *-FLAGS, SKIP GNJFN AND ITS BUGS
	JRST GNFIL5
	CAME A,[-2]		;-2 MEANS "NO FILES AT ALL" IN CERTAIN CASES
				;(THAT SHOULDN'T GET HERE ANYWAY)
	GNJFN			;STEP TO NEXT FILE IN *-GROUP
	JRST GNFIL5		;NO MORE
	JRST GNFIL8
GNFIL5:	AOS A,INIFH1		;NEXT NAME IN GROUP
	CAMLE A,INIFH2		;ARE THERE MORE?
	JRST [	POP P,B		;NO
		POP P,A
		RET]
GNFIL8:	HRRZ A,@INIFH1		;RETURN NEXT JFN IN A
	AOS -2(P)
	POP P,B
	SUB P,[XWD 1,1]
	RET
;FRSTF FRSTF1 NEXTF

;FRSTF AND NEXTF: ROUTINES FOR STANDARD USE OF INPUT FILE GROUP.
;CALL FRSTF BEFORE PROCESSING A FILE.
;  IT TYPES NAME IF A GROUP IS BEING PROCESSED.
;AFTER PROCESSING FILE, JRST NEXTF.
; IF NO MORE FILES IN GROUP, GOES TO RLJFNS WHICH RETURNS TO COMMAND
;	INPUT OR ANY OTHER ADDRESS WHICH HAS BEEN PUSHED.
; OTHERWISE, GETS HEXT JFN IN A, TYPES NEXT FILE NAME, AND RETURNS
;	WHERE FRSTF LAST RETURNED. BEWARE OF PD LEVEL CHANGES!

FRSTF:	POP P,FRSTFR		;SAVE RETURN FOR CALLS TO NEXTF
FRSTF1:	CALL TYPIF		;TYPE FILE NAME IF GROUP
	PUSH P,FRSTFR		;RETURN
	RET

NEXTF:	CALL GNFIL		;NEXT FILE IN GROUP
	JRST RLJFNS		;R1: NO MORE. FAILS IF GARBAGE IN PD!
	JRST FRSTF1
;DEVN DEVN1 DEVNE

;DEVN
;INPUT AND VERIFY A DEVICE NAME.
;READS STRING, ACCEPTING ALT MODE (ECHO COLON), EOL, SPACE, COLON, SEMI
; AS TERMINATOR.
;DOES NOT DISTINGUISH PHYSICAL NAMES AND ALREADY-DEFINED SYNONYMS.
;RETURNS:
;  A:  DEVICE DESIGNATOR
;  B:  CHARACTERISTICS WORD AS RETURNED BY "DVCHR". HIGHLIGHTS THEREOF:
;	B5: ON IF AVAILABLE OR ASSIGNED TO THIS JOB
;	B6: ON IF ASSIGNED
;	    BOTH B5 & B6 ON IF ASSIGNED TO SELF
;  C:  JOB # ASSIGNED TO IF B6 OF B ON

;ENTRY

DEVN:
;RETURN HERE TO TRY AGAIN AFDER TYPING " ? " AFTER ERROR.

DEVN1:	TLO Z,PUNCF
	INHELP <Device name>
	ALLOW TALT+TEOL+TSPC+TCOL
	PUSH P,CSBUFP		;SAVE POINTER INTO SPACE "BUFFF" USES
	CALL BUFFF		;BUFFER IT WITH NULL TERMINATOR, RET PTR IN A
	STDEV		;STRING TO DEVICE DESIG CONVERSION
	 JRST DEVNE
		;DESIGNATOR NOW IN B
		;NEED WE CHECK FOR WHOLE STRING USED?
	POP P,CSBUFP		;RECLAIM SPACE IN BUFFER USED BY "BUFFF"
	CAIN TRM,ALTM
	CALL UBP		;REMOVE ALT MODE FROM COMMAND STRING BUFFER
	ALTYPE <: >
	MOVE A,B
	DVCHR		;GET CHARACTERISTICS WORD
	HLRE C,C
	RET

;ERROR RETURN FROM "STDEV".

DEVNE:	POP P,CSBUFP		;RECLAIM SPACE IN STRING BUFFER USED BY "BUFFF"
	MOVE A,B		;MOVE ERROR CODE TO 1
	CAIE A,STDVX1		;"UNRECOGNIZED DEVICE"
	CALL JERR		;(4/13/70: NO ERRORS BUT STDVX1)
	TRNE CBT,TEOL
	JRST CERR		;AFTER CR, ABORT COMMAND.
	TYPE < ? >;		;OTHER TERMINATORS: " ? " AND RETRY.
	MOVE BFP,.BFP		;BACK UP PTR INTO COMMAND BUFFER
	BTCHER
	JRST DEVN1		;TRY AGAIN
;DIRNAM DIRNAX

;DIRNAM
;INPUT A DIRECTORY (INCLUDES USER) NAME, WITH RECOGINITION.
;RETURNS ENTIRE WORD FROM STDIR IN A, PTR TO BUFFERED STRING IN B.
;USED IN CONNECT, WHERE, ↑EPRINT COMMANDS.
;PRESERVES E (FOR DIRECTORY).

DIRNAM:	PUSH P,C
	TLO Z,PUNCF
	INHELP <Directory name>;READ NAME (REMEMBER "MORE" RETURNS HERE)
		;CALLER MUST CHECK TERMINATOR
	CALL BUFFF
	PUSH P,A		;SAVE TO BE RETURNED
	CAIN TRM,ALTM
	CALL UBP		;REMOVE ALT MODE FROM BUFFER
	MOVE B,A
	MOVEI A,1		;SAYS NO RECOG
	TRNE CBT,TALT
	TLO A,400000		;ALT MODE: REQUEST RECOGNITION
	STDIR
	 JRST CERR
	 JRST [	TRNN CBT,TALT		;AMBIGUOUS
		JRST CERR
		CALL DING
		SUB P,[1,,1]	;FLUSH JUNK
		JRST MORE]
	PUSH P,A		;SAVE WHAT STDIR RETURNED
	TRNN CBT,TALT		;DID STDIR RETURN UPDATED PTR?
	 JRST DIRNAX			;CSBUFP IS OK
	IBP B
	EXCH B,CSBUFP		;UPDATE STRING POINTER
	MOVE A,B
	BKJFN			;DECREMENT OLD BYTE PTR
	 CALL JERR		;...TO GET TO APPENDED CHARS (OR NULL IF NONE).
	CALL $CTYPE		;ECHO AND BUFFER REST AFTER ALT MODE
DIRNAX:	POP P,A			;DIR # AND BITS FROM STDIR
		;ALTYPE ( ) OR ALTYPE (>) MUST FOLLOW IN CALLING ROUTINE
	POP P,B
	POP P,C
	RET
;TTYNUM TTYN1 TTYN2 TTYN3 TTYN4 TTYN5 TTYN6 TTYN7 TTYN8 TTYN9 TTYN10 TTYN11

;INPUT A TTY NUMBER.

; MAYBE FROM USER NAME
; USED BY LINK, ADVISE

TTYNUM:	INHELP <One of the following:
Terminal number
User name>
	ALLOW TEOL+TSPC+TALT
	CALL BUFFF
	MOVEM P,FRAME		;SAVE BEGINNING OF POSSIBITITES
	MOVE B,.BFP		;GET 1ST CHAR
	ILDB A,B
	MOVE C,CHRTBL(A)
	TRNE C,OCTDIG
	JRST TTYN10		;TAKE AS TTY#

TTYN1:	TLO Z,BAKFF		;REUSE FIELD
	CALL DIRNAM		;INPUT AS USER NAME
	TLNE A,B0
	JRST CERR		;CAN'T LINK TO FILES ONLY DIR.
	ALTYPE ( )
	ALLOW TEOL+TSPC+TALT
	CONFIRM
	MOVEM A,DIRNO

TTYN2:	MOVEM P,FRAME		;SAVE BEG OF ARGS
	MOVE A,['JOBDIR']
	CALL $SYSGT
	HLLZ D,B		;MAKE AOBJN PTR
	MOVEI E,0(B)
TTYN3:	GTB 0(E)
	XOR A,DIRNO
	MOVEI A,(A)
	JUMPN A,TTYN6		;WRONG GUY
	HRLZ A,D
	GETAB
	 CALL JERR
	MOVEI B,0(D)
	JUMPE B,TTYN6		;IGNORE JOB0
	JUMPL A,TTYN6		;AND DETACHED JOBS
	HLRZS A
	PUSH P,A		;SAVE TTY# (1ST WORD OF A POSSIBILITY)

TTYN4:	MOVE A,['JOBNAM']
	CALL $SYSGT
	SKIPN A,B
	 JRST TTYN5
	HRL A,D
	GETAB
	 CALL JERR
	MOVE C,A
	MOVE A,['SNAMES']
	CALL $SYSGT
	SKIPN A,B
	 JRST TTYN5
	HRL A,C
	GETAB
	 CALL JERR

TTYN5:	PUSH P,A		;SAVE SUBSYSTEM NAME (2ND WRD OF POSS.)
TTYN6:	AOBJN D,TTYN3		;MAY HAVE MORE JOBS
	CAMN P,FRAME		;FOUND ANY?
	 ERROR <Not logged in>
	POP P,A			;SUBSYSTEM NAME
	POP P,B			;TTY#
	CAMN P,FRAME		;ONLY ONE POSSIBILITY?
	JRST [	MOVE A,B	;YES, USE IT
		JRST TTYN11]

TTYN7:	MOVE C,B		;SAVE FOR POSSIBLE DEFAULT
	ETYPE < TTY%2O%, >
	JUMPE A,[PRINT "?"	;NO SUBSYS NAME
		JRST TTYN8]
	CALL SIXPRT		;PRINT SUBSYSTEM

TTYN8:	PRINT EOL
	CAMN P,FRAME		;DONE ALL?
	 JRST TTYN9		;YES
	POP P,A
	POP P,B
	JRST TTYN7

TTYN9:	$TYPE < TTY:	>
	INHELP <Number>
	ALLOW TEOL+TSPC+TALT
	CAIN CNT,2
	 JRST [	MOVE B,.BFP	;ASKED FOR DEFAULT?
		ILDB B,B
		CAIE B,"-"
		 JRST .+1
		MOVE A,C	;NULL INPUT. USE FIRST JOB SEEN
		JRST TTYN11]

TTYN10:	TLO Z,BAKFF		;REUSE FIELD
	CALL OCTAL		;GOBBLE AS OCTAL NUMBER
	 JRST [	ALTYPE <->
		MOVE A,C
		JRST .+1]
	CONFIRM

TTYN11:	MOVE P,FRAME		;FLUSH BACK THE STACK
	PUSH P,A		;SAVE TTY#
	MOVE A,['TTYJOB']
	CALL $SYSGT
	CALL [	JUMPE B,JERR
		RET]
	HLRES B
	MOVMS B
	POP P,A			;TTY#
	CAIGE A,0(B)
	CAIGE A,0
	 ERROR <Non-existent terminal number>
	RET
;DATEIN

;DATE AND TIME INPUT

;KWV1 MUST BE SET UP FOR "CONF" (0 OK). CLOBBERS A,B.
;DATE STRING IS PRE-READ BY EXEC (BECAUSE OF NOISE AND EDITING);
;IF DATE CONTAINS IMBEDDED SPACES, SEVERAL TRIES MAY BE NEEDED TO
;GET ENOUGH CHARACTERS.

DATEIN:	TLO Z,PUNCF
	CALL CSTR
	AOS CNT		;MAKES BUFFF INCLUDE TERMINATOR
	CALL BUFFF
	SOS CNT
	SETZ B,		;FORMAT: NORMAL, FULLY GENERAL
	IDTIM		;INPUT AND CONVERT DATE AND TIME
	 CALL [		;IDTIM ERR RETURN: CODE IN B, STRING PTR IN A.
		EXCH A,B		;ERR CODE TO A (FOR JERR), STR PTR TO B
		;IF IT INPUT THE NULL, THEN IT NEEDS MORE CHARACTERS.
		CAIE A,DILFX1		;"ILLEGAL DATE FORMAT" ?
		CAIN A,TILFX1		;"ILLEGAL TIME FORMAT" ?
		JRST [	LDB B,B		;YES, GET LAST CHARACTER INPUT
			JUMPE B,[SUB P,[XWD 1,1]
				JRST MORE] ;GO BACK TO CSTR FOR MORE CHARS
			JRST CERR]	;ILLEG FORMAT B4 USING ALL CHARS
		CAIE A,DATEX3		;BAD DAY OF MONTH (EG FEB 30)
		CAIN A,DATEX5		;OUT OF RANGE (EARLY 1858 OR LATE 2576)
		JRST CERR		;"?"
		JRST JERR]		;GENERAL JSYS ERROR RETURN ROUTINE
	IBP A		;STEP STRING POINTER PAST THE NULL
	CAME A,CSBUFP		;ENTIRE STRING USED BY IDTIM?
	JRST CERR		;NO, TRAILING GARBAGE, ERROR.
	ALLOW TSPC+TALT+TEOL
	CONFIRM		;CHECK TERMINATOR, INPUT CR IF NECESSARY
	MOVE A,B		;DATE & TIME IN INTERNAL FORMAT
	RET
;DECIN BIGOCT BIGOC1 INCON1 OCTAL2 OCTAL3 OCTAL7 OCTAL

;"OCTAL": 18-BIT OCTAL NUMBER INPUT AND CONVERSION
;"BIGOCT": 36-BIT OCTAL (NOT EXTERNALLY USED 6/9/70)
;"DECIN": 36-BIT DECIMAL MAGNITUDE
;ALL RETURN VALUE IN A, TERMINATING CHARACTER IN "TRM".
;NO SKIP IF NULL INPUT.
;ERROR IF NON-DIGIT NON-TERMINATOR SEEN, OR IF OVERFLOW.
;ALLOWS ANY NON-ALPHNUMERIC AS TERMINATOR. CALLER MUST CHECK!
;DO NOT MAKE THIS A MONITOR FUNCTION BECAUSE OF DIFFICULTY OF
;  CAPTURING EXACT INPUT STRING FOR ↑R.

DECIN:	PUSH P,F		;ENTRY FOR 36-BIT DECIMAL MAGNITUDE
	INHELP <number>
	MOVEI F,↑D10
	JRST INCON1

BIGOCT:	INHELP <36-bit octal number>;		;ENTY FOR 36-BIT OCTAL MAGNITUDE
BIGOC1:	PUSH P,F
	MOVEI F,10
INCON1:	PUSH P,B		;ENTRY FOR 36-BIT MAGNITUDE OF BASE IN F
        PUSH P,C
        PUSH P,D
	PUSH P,E
        MOVE D,.BFP
	HRREI C,-1(CNT)
        SETZ A,
        JUMPLE C,OCTAL7		;NULL INPUT
	TLZ Z,F3		;NO MINUS SIGN SEEN
	ILDB E,D		;GET FIRST CHAR
	CAIE E,"-"
	JRST OCTAL3		;NOT MINUS, GOBBLE NUMBER
	TLO Z,F3		;SAY NEGATION NEEDED AT END
	SOJLE C,OCTAL7		;NULL, EXCEPT FOR - SIGN
OCTAL2: ILDB E,D
OCTAL3:	CAIGE E,"0"(F)
        CAIGE E,"0"
        JRST CERR          ;NON-DIGIT, NON-BLANK
	MUL A,F
	LSH B,1
	LSHC A,-1
        ADDI B,-60(E)
        JUMPN A, CERR		;OVERLFLOW
	MOVE A,B
        SOJG C,OCTAL2
	TLNE Z,F3
	MOVNS A			;RETURN NEGATIVE NUMBER IF - SEEN
	ALTYPE ( )
        AOS -5(P)
OCTAL7: POP P,E
	POP P,D
        POP P,C
        POP P,B
	POP P,F
        RET

OCTAL:	INHELP <18-bit octal number>;ENTRY FOR 18 BITS OCTAL (FOR ADDR)
	CALL BIGOC1
	RET
	TLNE A,-1
	JRST CERR
	AOS (P)
	RET
;OCTCOM OCCOM3 OCCOM5 OCCOM8

;"OCTCOM": 36-BIT OCTAL INPUT CONVERSION,
;ALLOWING ONE FIELD, OR TWO 18-BIT HALF-WORDS SEPARATED BY
; SPACE, ALT MODE, COMMA, OR TWO COMMAS.
;TERMINATORS ACCEPTED: ALT MODE, SPACE, EOL.
;CAN READ FIELD AFTER VALUE, HENCE GENERALLY ONLY VALID IF NUMBER
; IS LAST FIELD IN COMMAND.

OCTCOM:	CALL BIGOCT		;GET WHOLE VALUE OR LH
	 RET		;NULL, GIVE RETURN 1
	PUSH P,A		;VALUE IN PUSHDOWN
	TRNE CBT,TEOL
	JRST OCCOM8		;EOL ENDS IT - ANOTHER HALF NOT ALLOWED.
	TRNN CBT,TALT+TSPC
	JRST OCCOM3
;AFTER SPACE OR ALT MODE PERMIT RH.
	CALL OCTAL		;OPTIONAL 18-BIT VALEE FOR RH
	 JRST [ 	TLO Z,BAKFF		;NULL FIELD, BACKUP & RETURN
		JRST OCCOM8]
	JRST OCCOM5
OCCOM3:	ALLOW TCOM
;AFTER COMMA ALLOW ANOTHER AND REQUIRE RH
	CALL OCTAL
	 JRST [	ALLOW TCOM		;NULL, NOT OCTAL, HAS TO BE 2ND COMMA.
		CALL OCTAL		;NOW RH IS MANDATORY
		 JRST CERR
		JRST .+1]
;HAVE RH IN A. CHECK TERMINATOR, COMBINE

OCCOM5:	ALLOW TEOL+TSPC+TALT
	EXCH A,(P)
	TLNE A,-1
	JRST CERR		;MORE THAN 18 BITS IN LH
	HRLM A,(P)		;COMBINE IN PUSHDOWN
OCCOM8:	POP P,A		;RETURN VALUE IN A
	AOS (P)		;SKIP
	RET
;TOCT

;OUTPUT OCTAL NUMBER FROM B, NO LEADING ZEROES OR SPACES.

TOCT:	PUSH P,A
	PUSH P,C
	MOVE A,COJFN		;DESTINATION
	MOVE C,[1B0+10]		;"MAGINITUDE" FLAG AND RADIX
	NOUT
	 CALL JERRC		;GENERAL JSYS ERROR, CODE IN C
	POP P,C
	POP P,A
	RET
;BUFFS BUFFF BUFF0 BUFFF1 BUFFF2 BUFFF3

;BUFFF
;SUBROUTINE TO BUFFER LAST FIELD IN A MANNER SUITABLE FOR JSYS'S AND
;  RETURN A BYTE PTR TO IT IN A.
;COPIES TO SEPARATE BUFFER SPACE, PUTS NULL BYTE AT END.

;BUFFS IS THE SAME AS BUFFF BUT THE STRING SOURCE IS SUPPLIED IN B

BUFFS:	PUSH P,B
	JRST BUFF0

BUFFF:	PUSH P,B
	MOVE B,.BFP

BUFF0:	PUSH P,C
	PUSH P,D
	MOVE A,CSBUFP		;STRING BUFFER POINTER
	MOVEI C,↑D8(A)		;POINTER + MAX STRING LENGTH
	CAIL C,CSBUFE		;COMPARE TO BUFFER END
	ERROR <Overflow of EXEC's string storage area>
	MOVE C,CNT
	CAILE C,↑D40		;THIS HELPS PROTECT AGAINST CSBUF OVERLFOW
	ERROR <Word too long>
	SOJLE C,BUFFF2		;COUNT IS 1 FOR NULL FIELD
BUFFF1:	ILDB D,B
	CAIL D,141		;ASCII LOWER CASE A
	CAILE D,172		;..Z
	JRST .+2
	SUBI D,40		;TRANSLATE LOWER CASE TO UPPER
	CAIN D,CONTCH		;SPECIAL CHARACTER STORED WHEN "&" INPUT FOR
	MOVEI D," "		;..LINE CONTINUATION. TRANSLATE IT TO SPACE.
	IDPB D,A
	JUMPE D,BUFFF3		;STOP ON NULL
	SOJG C,BUFFF1		;OR IF ALL CHARACTERS MOVED
BUFFF2:	SETZ D,
	IDPB D,A		;TERMINATE WITH NULL
BUFFF3:	EXCH A,CSBUFP
	POP P,D
	POP P,C
	POP P,B
	RET
;ALLBK NALNBK BRKST1 NOECHO DOECHO ECHOST

;SUBROUTINE TO SET BREAK SET TO "ANY CHARACTER"

ALLBK:	PUSH P,C
	MOVEI C,17
	JRST BRKST1

;SUBROUTINE TO SET BREAK SET TO WAKE UP ON NON-ALPHANUMERICS

NALNBK:	PUSH P,C
	MOVEI C,16
BRKST1:	PUSH P,A		;ENTRY TO SET BREAK SET BITS FROM C
	PUSH P,B
	MOVE A,CIJFN
	RFMOD		;READ TELETYPE MODE WORD
	DPB C,[POINT 6,B,23]		;NEW BREAK SET BITS
	SFMOD		;SET MODE WORD
	POP P,B
	POP P,A
	POP P,C
	RET

;SUBROUTINE TO TURN OFF ECHOING BEFORE PASSWORD INPUT

NOECHO:	PUSH P,C
	TLO Z,NECHOF		;SAY ECHOING OFF (TESTED IN %NOI)
	MOVEI C,0		;SAY NO ECHOING NOHOW
	JRST ECHOST		;JOIN "DOECHO"

;SUBROUTINE TO TURN ON ECHOING AFTER PASSWORD INPUT

DOECHO:	PUSH P,C
	TLZ Z,NECHOF		;SAY ECHOING NOT SUPPRESSED
	MOVEI C,2		;SAY IMMEDIATE OR DEFERRED ECHOING
ECHOST:	PUSH P,A		;ENTRY TO SET ECHO BITS FROM C
	PUSH P,B
	MOVE A,CIJFN
	RFMOD		;READ TELETYPE MODE WORD
	DPB C,[POINT 2,B,25]
	SFMOD		;SET TTY MODE WORD
	POP P,B
	POP P,A
	POP P,C
	RET
;NOECEO NOECE1 DOECEO

;SUPPRESS EOL ECHOING: CHANGE CONTROL CHARACTER OUTPUT CONTROL
;BITS SO EOL'S DON'T PRINT.

NOECEO:	PUSH P,A
	PUSH P,B
	PUSH P,C
	MOVE A,COJFN
	RFCOC
	TRZ B,3B21+3B27		;TURN OFF LF AND CR
	TRZ C,3B27		;TURN OFF EOL
NOECE1:	SFCOC		;DOECEO JOINS HERE
	JRST [	POP P,C
		POP P,B
		POP P,A
		RET]

;TURN ON EOL ECHOING/PRINTING

DOECEO:	PUSH P,A
	PUSH P,B
	PUSH P,C
	MOVE A,COJFN
	RFCOC
;	TLZ B,(3B15)
;	TLO B,(2B15)		;TURN ON BELL
	TRO B,2B21+2B27		;TURN ON LF AND CR
	TRO C,2B27		;TURN ON EOL
	JRST NOECE1
;LTTYMD LTTYM8 LTTYM9

;LTTYMD - LOAD TELETYPE MODES
;AC E POINTS TO 11-WORD BLOCK OF VALUES TO PUT INTO EFFECT:
; 0	FILE (TERMINAL) MODE WORD
; 1-3	TAB STOPS
; 4-5	CCOC WORDS
; 6	JOB TERMINAL INTERRUPT WORD
; 7	DEFERRED WORD
; 10	SUBSYSTEM NAME

LTTYMD:	PUSH P,A
	PUSH P,B
	PUSH P,C
	PUSH P,D
	SKIPN 0(E)		;WILL BE 0 IF DETACHED (AUTOSTART)
	JRST LTTYM8		;SO JUST DO TIW AND SETNM
	MOVE A,COJFN
	MOVE B,(E)		;FILE MODE WORD
	SFMOD
	MOVE B,1(E)		;3 TAB STOPS WORDS
	MOVE C,2(E)
	MOVE D,3(E)
	STABS
	MOVE B,4(E)		;2 CCOC WORDS
	MOVE C,5(E)
	SFCOC
LTTYM8:	MOVEI A,400000
	RPCAP
	JUMPGE C,LTTYM9		;CAN'T SET TIW IF NO ↑C PRIV
;	TLO A,(1B0)		;SAY SET DEFERRED INTS TOO
	MOVE B,6(E)		;INTERRUPT MASK
;	MOVE C,7(E)		;DEFERRED INT MASK
	STIW
LTTYM9:	MOVE A,10(E)
	SETNM			;SUBSYSTEM NAME
	JRST [	POP P,D
		POP P,C
		POP P,B
		POP P,A
		RET]
;RTTYMD RTTYM9

;RTTYMD - STORE CURRENT TTY MODE, TAB STOPS, CCOC
; INTO BLOCK THAT AC E POINTS TO.

RTTYMD:	PUSH P,A
	PUSH P,B
	PUSH P,C
	PUSH P,D
	SKIPN ETTYMD+0		;RETURNING FROM DETACHED STARTUP?
	 JRST [	GJINF		;YES
		CAMN 4,[-1]	;STILL DETACHED?
		JRST RTTYM9	;YES
		MOVE 2,[1B4+↑D66B10+↑D72B17+17B23+2B25+1B26+1B29+1B31]
		MOVEM 2,ETTYMD+0
		MOVE 1,COJFN
		STPAR
		JRST .+1]
	MOVE A,COJFN
	RFMOD
	MOVEM B,(E)
	GTABS
	MOVEM B,1(E)
	MOVEM C,2(E)
	MOVEM D,3(E)
	RFCOC
	MOVEM B,4(E)
	MOVEM C,5(E)
RTTYM9:	GETNM
	MOVEM A,10(E)
	JRST [	POP P,D
		POP P,C
		POP P,B
		POP P,A
		RET]
;INETTY INPTTY

;NOTE: ALL MODE STUFF IN EXEC IS DONE WITH OUTPUT FILE, WHICH IS
;LESS LIKELY TO BE REDIRECTED TO NON-TTY THAN INPUT.
;MODE IS UNLIKELY TO NEED CHANGING FOR NON-TTY INPUT FILE;
;TO CHANGE IT USER MUST: A) USE A PROGRAM, SUCH AS DDT, OR B) TEMP SET
; OUTFILE=INFILE (IF PSEUDO-ECHOING DOESN'T INTERFERE). 4/22/70.


;INITIAL EXEC TTY STATE
INETTY:	0			;MODE WORD SAYS "DET" UNTIL WE GET A TTY
	1B0+1B8+1B16+1B24+1B32	;TABS
	1B4+1B12+1B20+1B28
	1B0+1B8+1B16+1B24+1B32
	BYTE (2) 0,0,1,1,1,0,0,2,2,2,2,1,2,2,1,1,1,1	;CCOC WORDS
	BYTE (2) 0,1,1,1,0,0,0,1,1,0,1,1,1,2,0,0,0,0
	1B<CTRLC>!1B<CTCODE>!1B<HUCODE>;!1B16	;EXEC TERM. INT. WORD
	0;	1B<CTRLC>			;DEFERRED INT'S. WHILE IN EXEC
	'EXEC  '		;SUBSYSTEM NAME

;INITIAL PROGRAM TTY MODES
INPTTY:	0
	1B0+1B8+1B16+1B24+1B32
	1B4+1B12+1B20+1B28
	1B0+1B8+1B16+1B24+1B32
	BYTE (2) 0,0,1,1,1,0,0,2,2,2,2,1,2,2,1,1,1,1
	BYTE (2) 0,1,1,1,0,0,0,1,1,0,1,1,1,2,0,0,0,0
	1B<CTRLC>!1B<CTCODE>!1B<HUCODE>	;PROGRAM TERM INT WRD
	0;	1B<CTRLC>			;DEFERRED WHILE PROGRAM RUNNING
	'(PRIV)'
;%PRINT PRIN1 CCHRO COUTC

;UUO TO OUTPUT SINGLE ASCII CHARACTER FROM EFFECTIVE ADDRESS

%PRINT:	PUSH P,A
	PUSH P,B
	AOS TTYACF		;TELL AUTOLOGOUT CODE THAT TTY IS ACTIVE
	MOVE A,COJFN
	HRRZ B,40
	CAIN B,37		;TENEX EOL?
	 JRST [	MOVEI 2,CR
		BOUT
		AOS TTYACF
		MOVEI 2,12
		JRST PRIN1]	;THAT OUGHT TO KEEP THE FTP GUYS HAPPY
PRIN1:	BOUT
	AOS TTYACF		;AGAIN, MAYBE BLOCKED DUE TO FULL BUFFER
	POP P,B
	POP P,A
	RET

;SUBR TO OUTPUT CHARACTER FROM B.
;ALSO STORE IT IN CBUF (POINTER "CBP") IF FLAG "STCF" ON
;    (AS DURING PRINTING AFTER ALT MODE).
;TRANSLATES SPECIAL INTERNAL CHARACTER FOR LINE CONTINUATION BACK
; TO &-EOL-SPACE, AS REQUIRED FOR ↑R AND ↑A EDITING CHARACTERS.

CCHRO:	CAIN B,CONTCH		;CONTINUATION CHARACTER
	JRST [	UTYPE [ASCIZ /&
 /]
		RET]
	TLNN Z,STCF
        JRST COUTC
        PUSH P,B
        MOVEI B,(BFP)
        CAIL B,CBUFE
        ERROR <Command too long>
        POP P,B
        IDPB B,BFP
        AOJ CNT,

;FOLLOWS CCHRO...
;OUTPUT CHARACTER FROM B WITHOUT STORAGE FLAG TEST (USED?)

COUTC:	PUSH P,A
	AOS TTYACF		;TELL AUTOLOGOUTTTY IS ACTIVE
        MOVE A,COJFN      	;FILE NUMBER OF PRIMARY OUTPUT FILE
        BOUT
	AOS TTYACF
        POP P,A
        RET
;MAPPF MPPF1 MPPF8 MAPACS LOADF STOREF

;MAP A PAGE OF A FORK
;TAKES:	AC A:	AN ADDRESS IN THE PAGE, OR -1 TO CLEAR BUFFER
;	CELL "FORK": FORK HANDLE
;RETS:	AC A:	ACCESS AND EXISTENCE BITS IN B2-5, RH PRESERVED
;	BUFFER PAGEN: THE PAGE MAPPED

MAPPF:	PUSH P,C
	PUSH P,B
	PUSH P,A
	JUMPL A,MPPF1
	MOVEI A,0(A)
	CAIG A,17
	JRST MAPACS
	LSH A,-↑D9		;SEPARATE PAGE #
	HRL A,FORK		;FORK HANDLE OF PAGE WE WANT
	SKIPGE FORK		;IS THERE A CURRENT FORK?
	ERROR <No program>;		;NO.
	TLO A,B0		;SAY FORK HANDLE NOT JFN
MPPF1:	MOVEI B,PAGEN		;GENERATE DESTINATION PAGE IDENTIFIER
	LSH B,-↑D9		;...MUST SHIFT AT RUN TIME CAUSE EXTERNAL
	TLO B,B0		;...SAY THIS FORK
	HRLZI C,B2+B3+B4		;REQUEST ALL ACCESS, NORMAL DISPOSAL
	CAME A,NPAGE		;SAVE TIME IF ALREADY MAPPED
	PMAP		;MAP IT
	MOVEM A,NPAGE		;SAY ITS MAPPED
	CAME A,[-1]
	RPACS		;GET ACCESS/EXISTENCE OF MAPPED PAGE
MPPF8:	POP P,A		;RH A TRANSPARENT
	HLL A,B		;ACCESS IN LH A
	POP P,B
	POP P,C
	RET

;REFERENCE IS TO AN AC. READ ACS INTO PAGEN WITH "RFACS".
;IN THIS CASE CALLER MUST USE SFACS IF HE WISHES TO CHANGE A LOCATION.

MAPACS:	SETO A,
	CALL MAPPF		;UNMAP PAGE IN BUFFER, IF ANY.
	SKIPGE A,FORK
	ERROR <No program>
	MOVEI B,PAGEN
	RFACS		;READ FORK ACS INTO "PAGEN"
	HRLZI B,B2+B3+B4+B5		;SIMULATE ALL ACCESS BITS
	JRST MPPF8

;LOAD SINGLE WORD FROM FORK, GIVEN ADDRESS IN A

LOADF:	CALL MAPPF
	TLNN A,B5
	ERROR <No such page>
	TLNN A,B2
	ERROR <Can't read that page>
	ANDI A,777
	MOVE A,PAGEN(A)
	RET

;STORE SINGLE WORD FROM B INTO FORK, ADDRESS IN A

STOREF:	CALL MAPPF
	TLNE A,B5		;OK TO STORE IF PAGE NON-EXISTENT
	TLNE A,B3!B9		;OR IF WRITE ACCESS PERMITTED
	CAIA
	ERROR <Can't write into page>
	ANDI A,777
	MOVEM B,PAGEN(A)
	RET
;%GTB

;%GTB
;UUO TO DO A "GETAB" JSYS WITH A REASONABLE CALLING SEQUENCE.
;TABLE # IN EFF ADDR, INDEX IN RH OF D, ONE RETURN WITH WORD IN A.
;TYPICAL USAGE: LH D CONTAINS AOBJN COUNTER, B AND C ARE FREE
;	FOR USE IN OTHER JSYS CALLS INSIDE LOOP.

%GTB:	HRL A,D
	HRR A,40
	GETAB
	 CALL JERR
	RET
;HUPSI HUPSI9 HUPSI8 HUPSI7

;ERROR, PSEUDO-INTERRUPT, %-MESSAGE-TYPING STUFF

;PSI ROUTINE FOR DATAPHONE CARRIER OFF (HANGUP).
;TERMINAL CODE ↑D30, ASSIGNED TO CHANNEL 4, LEVEL 2.
;DETACHES JOB TO FREE UP DATAPHONE, KILLS JOB IF NOT LOGGED IN.

HUPSI:	PUSH P,A
	PUSH P,B
	PUSH P,C
	PUSH P,D
	GJINF
	JUMPL D,HUPSI9		;DETACHED ALREADY, IGNORE IT.
	MOVEI A,-1		;REFERENCE CONTROLLING TTY EVEN IF ITS NOT
		;PRI I/O FILE
	RFMOD
	TRNE B,1B25
	JUMPL D,HUPSI9		;CARRIER NOT NOW OFF, IGNORE.
	DTACH		;DETACH CONTROLLING TERMINAL
	GJINF		;GETS TSS JOB # IN A
	JUMPG A,HUPSI8		;JUMP IF LOGGED IN
	SETO A,		;NOT LOGGED IN, SAY SELF,
	LGOUT		;KILL JOB.
	 CALL JERR
HUPSI9:	POP P,D
	POP P,C
	POP P,B
	POP P,A
	DEBRK

;HANGING UP ON LOGGED IN JOB RESULTS IN DETACH AND FREEZE.
;IF JOB IS NOT REATTACHED WITHIN 20 MINUTES, IT IS LOGGED OUT

HUPSI8:	MOVEI A,-4
	TLNE Z,RUNF
	FFORK			;FREEZE ALL INFERIORS
	TIME
	MOVE 2,1
	ADD 2,[↑D1200000]	;20 MINUTES
HUPSI7:	PUSH P,2
	MOVEI 1,↑D3000
	DISMS			;WAIT 3 SECONDS
	GJINF			;GET CONTROL TTY NOW
	TIME
	POP P,2
	JUMPGE 4,[MOVEI A,-4	;IF JOB NOW RE-ATTACHED,
		TLNE Z,RUNF
		RFORK		;RESUME RUNNING
		JRST HUPSI9]
	CAMGE 1,2		;WAITED 20 MINUTES?
	JRST HUPSI7		;NO, WAIT SOME MORE
	SETO A,			;YES, JOB IS DEFINED AS ABANDONED
	LGOUT			;SO LOG IT OUT
	 CALL JERR
;USEPSI USEPS4 USEPS5 USEPS6 DING

;PSI ROUTINE FOR TERMINAL CHARACTER THAT PRINTS RUNTIME (↑T)

USEPSI:	PUSH P,40
	PUSH P,A
	PUSH P,B
	PUSH P,C
	MOVE A,COJFN
	RFCOC
	PUSH P,B		;SAVE CCOC WORDS
	PUSH P,C
	CALL DOECEO		;MAKE SURE CCOC IS SUCH THAT EOLS PRINT
				;AND THAT BELLS DING
;	MOVEI 2,BELL
;	BOUT
;USEPS1:	GTAD			;"NOW"
;	CAMG 1,CTLIM0		;2ND ↑T WITHIN 15 SEC?
;	CAMG 1,CTLIM1		;AND AT LEAST A MIN SINCE LAST TYPEOUT?
;	 JRST USEPS3		;NO
;
;USEPS2:	MOVEI 2,CTTIM1		;ONE MINUTE
;	CALL TIMPSC		;TAD IN 1 PLUS SECONDS IN 2
;	MOVEM 1,CTLIM1		;CLOSEST TIME OF NEXT FULL TYPEOUT
;	JRST USEPS4		;GO DO FULL TYPEOUT
;
;USEPS3:	MOVEI 2,CTTIM0		;SECONDS
;	CALL TIMPSC
;	MOVEM 1,CTLIM0		;UPDATE 15 SECONDS BETWEEN ↑T TIMER
;	JRST USEPS6		;AND SKIP FULL TYPEOUT

USEPS4:	SKIPGE A,FORK
	JRST USEPS5		;NO INFERIOR
	PRINT " "
	CALL FSTAT		;PRINT STATUS & PC OF INF (HANDLE IN A)
	PRINT " "		;FSTAT IS IN XMAIN.MAC
USEPS5:	CALL LAPRNT		;PRINT LOAD AV.  NEAR "RUNSTAT"
	ETYPE <, used %V in %C
>
USEPS6:	MOVE A,COJFN
	POP P,C
	POP P,B
	SFCOC			;RESTORE CCOC
	POP P,C
	POP P,B
	POP P,A
	POP P,40
	DEBRK

;DING
;SUBROUTINE TO RING BELL, CLEAR INPUT BUFFER, STOP NON-INTERACTIVE JOB.
;USED AFTER RECOGNITION AMBIGUITIES AND SUCH ERRORS.

DING:	PUSH P,A
	MOVE A,CIJFN		;COMMAND INPUT FILE JFN
	CFIBF			;CLEAR INPUT BUFFER
	BTCHERR			;THIS SHOULD STOP NON-CONVERSATIONAL JOB
	PRINT BELL		;OUTPUT BELL
	POP P,A
	RET
;CERR NIM NIYE SCREWUP JERR JERR1 JERRC

;REGULAR ERROR - SYNTAX OR OBVIOUS SEMANTIC ERROR

CERR:  $ERROR < ?>

;NOT IMPLEMENTED YET ERROR
;DISPATCH TO HERE AUTOMATICALLY SUPPLIED BY COMMAND TABLE ENTRY MACRO
; IF NO ROUTINE IS DEFINED FOR THE COMMAND.

NIM:
NIYE:	ERROR <Not implemented yet>

;INTERNAL ERROR
SCREWUP:HRRZ E,(P)		;PC (GET HERE WITH PUSHJ)
	SUBI E,1
	ERROR <EXEC screwed up at %5P  ACs %1O %2O %3O>

;ERROR RETURN FROM A JSYS, SYSTEM ERROR # IN 1.
;PRINTS SYSTEM MESSAGE AND GOES BACK TO COMMAND INPUT.
;MOST ERROR RETURNS WILL REQUIRE SOME SPECIAL CASE CHECKS
; BEFORE COMING TO THIS GENERAL ROUTINE.
;NOTE: ERROR NUMBER IN A IS USED INSTEAD OF -1 ARG TO "ERSTR"
; BECAUSE THIS ROUTINE IS ALSO USED WITH SUBROUTINES THAT SIMULATE
; JSYS'S. 6/26/70.

JERR:	MOVEM A,ERCOD		;SAVE ERROR NUMBER
JERR1:	PUSH P,A
	INTON			;BE SURE INTERRUPTS ARE ON
	POP P,A
	CALL ERFRST		;GET SET TO TYPE MSG
	CALL CRIF		;EOL UNLESS AT LEFT
	TYPE <JSYS error return in EXEC>
	    HRRZ F,(P)		;PC (GOT TO JERR WITH PUSHJ)
	    SUBI F,2		;PROBABLE LOC OF JSYS
	    PRINT EOL
	    ETYPE < PC %6P  ACs %1O %2O %3O>
	JRST SYSERA		;GO TYPE SYSTEM ERROR MESSAGE

JERRC:	MOVEM C,ERCOD		;"JERR" FOR ERROR CODE IN C
	JRST JERR1		;  (AS AFTER "NOUT")
;%TRAP

;ERROR PSEUDO-INTERRUPT ON LEVEL 1 UUO SERVICE ROUTINE
;DEBREAK IMMEDIATELY BECAUSE IF ANOTHER TRAP WERE TO OCCUR DURING
;THIS ONE, MONITOR MIGHT HAVE TROUBLE HANDLING IT.
;THEN TYPE TEXT EFF ADDR POINTS TO, "TRAP IN EXEC",
;  TYPE SYSTEM ERROR MESSAGE WITH
;  REGULAR ROUTINE, AND RETURN TO COMMAND INPUT.

%TRAP:	PUSH P,D
	PUSH P,E
	HRRZ E,LEV1PC		;GET PC OF ERROR
	CIS			;CLEAR THIS INTERRUPT,
				;ALSO CLEAR LOWER-LEVEL INTRPTS
				;SUCH AS ↑T AND CARRIER-OFF.
				;NOPS IF NOT ON A PSI,
		;WHICH CAN HAPPEN VIA SPECIAL CASE IL INST STUFF.
	MOVEI D,RERET		;CHANGE ERROR ROUTINE RETURN
	MOVEM D,CERET		;...TO "REGULAR"
	SETZM .JBUFP		;SAY FLUSH ALL JFNS
;HERE WE MUST CHECK FOR EOF IN COMMAND FILE AND HANDLE SPECIALLY.
;ALSO I'M SURE MANY OTHER EXECEPTIONAL CASES WILL TURN UP.
	MOVE D,40		;SAVE TEXT ADDRESS
	CALL ERFRST		;DO THINGS NEEDED BEFORE TYPING MESSAGE
	CALL CRIF		;EOL IF CARRIAGE NOT AT LEFT MARGIN
	UTYPE (D)		;TYPE CHANNEL-SPECIFIC MESSAGE
	TYPE < trap in EXEC>
	   PRINT EOL
	    ETYPE < PC %5P%  ACs %1O %2O %3O>;
	POP P,E
	POP P,D
	JRST SYSERM		;GO TYPE SYSTEM ERROR MESSAGE.

;NOTE: IN THE EXEC THERE ARE NO INTERRUPTS WHICH DEBREAK TO THE POINT
;OF INTERRUPTION.  HENCE WE NEEDN'T WORRY ABOUT CELLS SUCH AS "RERET"
;BEING CHANGED.  BUT WE DO HAVE TO CODE ROUTINES SUCH AS "RLJFNS" TO
;WORK OK IF INTERRUPTED IN THE MIDDLE AND RESTARTED.
;ILIPSI EOFPSI

;ILLEGAL INSTRUCTION PSI
;GO TO SPECIAL CASE ROUTINE ILIDSP POINTS TO, IF NON-0,ELSE
;TREAT LIKE OTHER ERROR PSI'S.
;ILIDSP USED, FOR INSTANCE, TO DETECT "LIST ACCESS NOT ALLOWED" FROM
; GTFDB JSYS.
;SPECIAL ROUTINE GETS PC IN ERPC, ERROR CODE IN ERCOD.
;IF SPECIAL ROUTINE ISN'T INTERESETED IN THIS PARTICULAR ERROR,
; IT CAN JRST TO ILIPSI AGAIN.

ILIPSI:	SKIPN ILIDSP		;IS THERE A SPECIAL DISPATCH?
	TRAP <Illegal instruction>;	NO. NORMAL CASE.
	CIS		;CLEAR THE INTERRUPT (NOPS IF NONE), CLEAR LOWER
		;LEVEL INTERRUPTS SUCH AS ↑T AND CARRIER OFF.
	PUSH P,ILIDSP		;SAVE SPECIAL DISPATCH ADDR FOR "RET" BELWOW
	PUSH P,A
	PUSH P,B
	HRRZ A,LEV1PC
	MOVEM A,ERPC		;LOCATION OF ERROR, FOR SPECIAL ROUTINE.
	MOVE A,[CALL CUUO]		;RESET UUO DISPATCH TO PROTECT
	MOVEM A,41		;IT FROM MALICIOUS USERS
	SETZM ILIDSP		;CLEAR SPECIAL DISPATCH
	MOVEI A,B0
	CALL $GETER		;DO GETER JSYS AND RESTORE 4-10
	HRRZM B,ERCOD		;ERROR CODE, FOR SPECIAL ROUTINE
	POP P,B
	POP P,A
	RET		;DISPATCH TO SPECIAL ROUTINE

;END-OF-FILE INTERRUPT
;DEBREAK TO SPECIAL ROUTINE "EOFDSP" POINTS AT, OR,
; IF EOFDSP ZERO, TREAT LIKE OTHER ERROR PSEUDO-INTERRUPTS.
;"EOFDSP" IS NORMALLY ZERO BUT IS SET NON-0 FOR FILE-COPYING COMMANDS.

EOFPSI:	SKIPN EOFDSP
	TRAP <Unexpected end-of-file>; NO SPEC DISPATCH, TREAT AS ERROR
	PUSH P,A
	MOVE A,EOFDSP		;CHANGE INTERRUPT RETURN
	HRRM A,LEV1PC		;OLD PC IS LOST
	SETZM EOFDSP		;FUTHER INTERRUPTS ARE ERRORS
	POP P,A
	DEBRK
;DATPSI

;FILE DATA ERROR INTERRUPT
;TYPES A MORE USER-ORIENTED MESSAGE THAN "TRAP" UUO.
;IF A COPY OPERATION, ETC, IS IN PROGRESS, IT GETS ABORTED AND
;  FILES ARE CLOSED, SO OUTPUT FILE IS TRUNCATED.

DATPSI:	CIS		;CLEAR INTERRUPT (AND LOWER ONES!)
	MOVEI E,RERET
	MOVEM E,CERET		;REST ERROR RETURN TO "NORMAL"
	SETZM .JBUFP
	HRRZ E,LEV1PC
	ERROR <File data error at EXEC PC %5P>;
		;SHOULD GET JFN (GETER?) AND PUT NAME IN ABOVE MESSAGE
		;AND PROBOBLY ELIMINATE PC. ←←←←←←←←←←←
;CCPSI

;SUPER-PANIC CHARACTER (CURRENTLY ↑C) PSEUDO-INTERRUPT ROUTINE.
;CHANNEL 1, LEVEL 1

CCPSI:	TLOE Z,CTLCF1		;SAY WE'VE SEEN AN ↑C
	TLO Z,CTLCF2		;IF ITS THE SECOND ONE, SAY SO
				;(CTLCF2 CAUSES OUTBUF TO BE CLEARED).
	SETZM ILIDSP		;CLEAR SPECIAL IL INST DISPATCH ADDRESS
	CIS			;CLEAR THIS INTERRUPT
				;AND ANY LOWER LEVEL ONES SUCH AS
				;↑T OR CARRIER OFF.
				;DOING THIS RIGHT OFF CAUSES
				;MULTIPLE ↑C'S TO BE DETECTED
				;PROPERLY AND MAKES IL
				;INST TRAP WORK DURING ↑C ROUTINE.
	MOVE A,CIJFN
	CFIBF			;ALWAYS RESET INPUT BUFFER ON ↑C
	MOVEI A,CCERET		;SET ERROR ROUTINE TO SPECIAL ↑C VALUE
	MOVEM A,CERET		;..
	SETZM .JBUFP		;SAY FLUSH ALL JFN'S USED IN CURRENT COMMAND
	MOVE A,[CALL CUUO]	;RESET UUO DISPATCH (BECAUSE IF PAGE 0 IS IN PMF
	MOVEM A,41		;(WHICH IT ISN'T), MALICOUS USERS CAN PATCH 41
		;TO MAKE EXEC TRANSFER TO ANY CODE THEY WISH).
	SKIPL A,EFORK		;IF EPHEMERON RUNNING,
	FFORK			;FREEZE IT
	JUMPGE A,CCDB4		;AND SKIRT AROUND TTY STUFF
	TLNN Z,RUNF		;PROGRAM RUNNING?
	JRST CCDB3		;NO.
	MOVE A,LRFORK		;LAST PROGRAM RUN IS WHERE ↑C CAME FROM
	FFORK			;FREEZE THE WORLD
	MOVEI E,PTTYMD
	CALL RTTYMD		;STORE TTY MODES FOR "CONTINUE".
;CCDB2 CCDB3 CCDB4 CCERET

;↑C...

CCDB2:	TLZ Z,RUNF		;DON'T DO TTY MODES ON 2ND ↑C!
CCDB3:	MOVEI E,ETTYMD		;PUT EXEC'S TTY MODES INTO EFFECT.
	CALL LTTYMD		;MUST ALWAYS BE DONE
				;EG GTJFN LEAVES THEM BAD.

CCDB4:	MOVE A,COJFN
	TLNN Z,CTLCF2		;2ND ↑C?
	 JRST [	SETZM ERRMF
		U.$ERR [ASCIZ /↑C/]	;DON'T CLEAR INPUT BUFFER
		JRST CCERET]	;SO NO ERR IN ERR
	CFOBF			;YES, CLEAR OUTPUT BUFFER.

;USE REGULAR ERROR ROUTINE TO CLEAR INBUF, TYPE "↑C", RELEASE JFNS, 
;AND GENERALLY CLEAN UP.
;RETURNS TO FOLLOWING LOCATION BECAUSE WE SET "CERET" ABOVE.

	SETZM ERRMF		;CLEAR "PROCESSING AN ERROR" FLAG
				;ANOTHER ↑C WHILE PROCESSING 1ST IS OK
	$ERROR <↑C>;		;NO CR FIRST!

CCERET:	MOVE A,COJFN
	TLNN Z,CTLCF2		;BUT DON'T WAIT IF 2ND ↑C
	DOBE			;2ND ↑C MAY HAPPEN HERE
	TLZ Z,CTLCF1+CTLCF2
	JRST ERRET		;RETURN TO COMMAND INPUT
;ALOPSI ALOPS1 AUTOLO AUTOL6

;AUTOLOGOUT PSI AND ROUTINE

;PROGRAM-GENERATED PSI ON CHANNEL 2, LEVEL 1 DISPATCHES HERE

ALOPSI:	PUSH P,A
	PUSH P,B
	PUSH P,C
	PUSH P,D
	GJINF		;GETS LOGIN USER # IN A
	JUMPLE A,ALOPS1		;NOT LOGGED IN - EXPECTED CASE.
	POP P,D		;USER GOT LOGGED IN DURING SCHEDUALING OF PSI
	POP P,C		;OR SOME SUCH STRANGE CASE, JUST IGNORE PSI.
	POP P,B
	POP P,A
	DEBRK		;DEBREAK TO INTERRUPTED LOCATION

ALOPS1:	CIS		;ITS REAL. CLEAR PSI SYSTEM SO AUTOLOGOUT
				;IS DONE NOT ON AN INTERRUPT LEVEL.

;EXEC'S MAIN FORK JRST'S HERE,
;ALSO PSI FALLS INTO HERE, TO DO AUTOLOGOUT.
;MAKE CHECKS, TYPE MESSAGE, LOG JOB OUT.

AUTOLO:	SKIPLE CUSRNO		;SKIP IF NOT LOGGED IN
	ERROR <Autologout screwup in EXEC>
	GJINF			;GETS CONTROLLING TTY # IN 4
	CAMN D,[-1]		;-1 IF NONE (DETACHED)
	JRST AUTOL6		;DETACHED, TYPING MESSAGE WOULD HANG JOB.
				;CAN BE DETACHED IF DATAPHONE
				;HUNG UP AND CARRIER-OFF PSI
				;ISN'T FULLY PROCESSED,
				;OR IF ATACH HAS SOMEHOW FAILED TO
				;COMPLETE.
	CALL DOECEO		;MAKE EOL'S PRINT!
	TYPE <
 Autologout - bye bye!
>
	MOVE A,COJFN
	DOBE			;MAKE SURE IT ALL TYPES (NEEDED?)
AUTOL6:	SETO A,			;SAY SELF
	LGOUT			;LOG JOB OUT
	 CALL JERR		;SHOULDN'T BE ABLE TO HAPPEN.
;%ERR %.$ERR SYSERA SYSERM ERR1 ERR5 ERR04 ERR5A ERR6

;ERROR UUO HANDLER. MESSAGE TEXT AT EFFECTIVE ADDRESS.
;SERVICES UUO'S UERR, U$ERR, U.$ERR (MACROS ERROR, $ERROR AND .$ERROR)

%ERR: %$ERR: TLZA Z,F1
%.$ERR:	TLO Z,F1		;SAY DON'T CLEAR INBUF (ERFRS1)
	PUSH P,40		;TEXT ADDRESS AND UUO VALUE
	CALL ERFRS1		;SETUP BEFORE TYPING ERROR MSG
	JRST ERR1

;ENTER HERE TO TYPE SYSTEM ERROR MESSAGE FOR ERROR # IN "ERCOD"
;MUST HAVE ALREADY CALLED "ERFRST"

SYSERA:	PUSH P,[-2]
	JRST ERR1

;ENTER HERE TO TYPE MOST RECENT SYSTEM ERR MESSAGE

SYSERM:	PUSH P,[-1]		;INDICATE USE OF SYSTEM ERROR MESSAGE
	AOS .JBERR

;TYPE MESSAGE: CR FIRST UNLESS ALREADY AT LEFT, THEN SPACE (ALWAYS),
;THEN TEXT, THEN CR, BUT NO INITIAL CR-SPACE IF "U$ERR" UUO.

ERR1:	PUSH P,A		;AC'S MUST BE SAVED FOR ETYPE OR ERSTR
	PUSH P,B
	HLRZ B,-2(P)		;-2 FOR SYSTEM MSG, OR UUO FOR EXEC MSG
	CAIE B,<U.$ERR>B53
	CAIN B,<U$ERR>B53
	CAIA			;NO CR-SPC FOR U$ERR UUO ($ERROR MACRO)
	 CALL CRIF		;TYPE EOL IF NOT ALREADY AT LEFT
ERR5:	INTOFF
	SKIPGE A,EFORK		;USE EPHEMERAL FORK IF IT EXISTS
	MOVEI A,400000		;OR EXEC IF NOT
	MOVE B,-2(P)		;0, -1, -2, OR UUO-TEXT ADDRESS
	JUMPG B,ERR5A		;PRINT ASCIZ TEXT SUPPLIED WITH UUO
	JUMPE B,ERR6		;PRINT NOTHING
	AOJE B,[CALL $GETER	;ERROR NUMBER TO B
		JRST ERR04]
	HRR B,ERCOD		;-2 SAYS USE SYSTEM ERR # FROM "ERCOD"
ERR04:	HRL B,A			;FORK HANDLE
	MOVE A,COJFN		;DESTINATION
	SETZ C,			;SAY PARAMETERS FROM PSB, NO LGTH LIMIT.
	ERSTR			;SYSTEM ERROR MESSAAGE TO STRING
	 JRST [	UETYPE [ASCIZ /Message not found for error %2P/]
		JRST ERR6]	;R +1: BAD ERROR #
	 JRST [	SETZ A,		;R +2: DESTINATION PROBLEM,
		HFORK]		;HALT.
	 JRST ERR6		;R +3: DONE.

ERR5A:	MOVE B,0(P)
	MOVE A,-1(P)		;ETYPE USES VALUES THAT CAME IN AC'S
	UETYPE @-2(P)		;TYPE MESSAGE FROM CORE
ERR6:	INTON
	PRINT EOL
	TLNE Z,LOGOFF
	TYPE < Not logged off
>;		;ERROR DURING LOGOUT, LIKELY AFTER "LOGGED OFF" MESSAGE
;ERR7 ERR7F ERR8 RERET

;ERROR UUOS AND SYSERM...
;MESSAGE ALL TYPED.

ERR7:	CALL DOECHO		;MAKE SURE ECHOING IS ON
	CALL RLJFNS		;CLOSE AND RELEASE ALL JFNS USED IN CMD
	PUSH P,C
	PUSH P,D
	HLRZ A,-4(P)		;-1 OR UUO
	TLNN Z,CTLCF1		;CHECK ↑C COUNT (KLUDGE←←←←)
	CAIE A,<U.$ERR>B53	;DON'T CLEAR BUFFERS FOR .$ERROR
	CAIA
	JRST ERR7F		;(USED FOR RUBOUT, ↑X (CCHRI)).


;CLEAR ALL PAGE WINDOWS, IE UNMAP PAGES OF OTHER FORKS OR FILES.
	SETO A,			;PAGE OF INFERIOR FORK
	CALL MAPPF
	CALL UNMAP		;FLUSH BUFFER PAGES TOO

ERR7F:	INTOFF			;AVOID RACE AGAINST WFORK AT CIN45
	SKIPL 1,EFORK		;IS THERE AN EPHEMERAL FORK?
	KFORK			;YES. FLUSH IT
	SETOM EFORK		;AND SAY SO
	INTON
	POP P,D
	POP P,C
	BTCHER			;SHOULD STOP NON-CONVERSATIONAL JOB
ERR8:	POP P,B
	POP P,A
	SUB P,[1,,1]		;FORGET UUO
				;RESTORE EARLIER (LESS FULL) PLUSHDOWN
				;LEVEL IF LEVEL WAS SAVED IN ".P" .
				;THIS IS GENERALLY USED DURING
				;INPUT.
	SKIPE .P
	MOVE P,.P
	SETZM ERRMF		;NO LONGER PROCESSING AN ERROR
	JRST @CERET		;VARIABLE ERROR RETURN.  MAY GO SPECIAL
				;PLACES.  SUCH AS SUB-COMMAND INPUT FOR
				;"DIRECTORY" COMMAND.

;REGULAR ERROR RETURN - CERET USUALLY POINTS HERE

RERET:				;DO ANY OTHER CLEANING UP
	JRST ERRET		;GO BACK TO COMMAND INPUT
;ERFRST ERFRS1 ERFRS2 ERFRS3

;SUBROUTINE TO CALL BEFORE TYPING ANY ERROR MESSAGE TEXT
; OR EXECUTING ANY JSYS'S. MUST BE CALLED ONLY ONCE PER ERROR.

ERFRST:	TLZ Z,F1		;NORMAL ENTRY
ERFRS1:				;ENTER HERE TO NOT CLEAR INBUF IF F1 ON
	SKIPN CINITF		;IS EXEX INITIALIZED?
	HALTF			;NO, TYPING MESSAGE MIGHT FAIL & PRODUCE
				;INFINITE LOOP, SO JUST HALT.
	TLZ Z,BAKFF+STCF	;CLEAR FLAGS FOR:
				; REUSE SAME INPUT FIELD
				; STORE PRINTED CHARACTERS IN CMD BUFFER
	PUSH P,A
	PUSH P,B

ERFRS2:	INTOFF			;BE SURE ALL UPDATED SIMULTANEOUSLY
	GPJFN
	SKIPGE CREDIF		;IF INPUT WAS REDIRECTED,
	HLRZM 2,CRJFNI
	MOVMS CREDIF		;UPDATE FLAG
	SKIPGE CREDOF
	HRRZM 2,CRJFNO		;SAVE FOR * OPTION OF "RED" AND "DET"
	MOVMS CREDOF
	MOVE 2,PRIMRY		;RESTORE JFNS WE HAD AT ENTRY
	SPJFN
	MOVE A,[CALL CUUO]	;RESET UUO DISPATCH, BECAUSE OTHERWISE
	MOVEM A,41		;MALICIOUS USERS CAN MAKE EXEC TRANSFER
				;TO ANY CODE THEY WISH BY PATCHING
				;PAGE 0 OF PMF
	INTON
ERFRS3:	CALL DOECEO		;MAKE SURE CCOC IS SUCH THAT EOLS PRINT
	SKIPE ERRMF		;ALREADY PROCESSING AN ERROR?
	JRST [	UTYPE [ASCIZ /
 Error within an error
/]		;YES, GIVE UP
		JRST ERRET]
	SETOM ERRMF		;SAY PROCESSING AN ERROR
	MOVE A,CIJFN
	DOBE
	TLNN Z,F1		;DONT CLR INBUF FOR RUBOUT, ↑X (.$ERROR)
	CFIBF			;CLEAR FILE INPUT BUFFER
	POP P,B
	POP P,A
	RET
;CRIF $GETER

;TYPE EOL UNLESS CARRIAGE IS ALREADY AT LEFT.

CRIF:	PUSH P,A
	PUSH P,B
	MOVE A,COJFN
	RFPOS			;READ FILE POSITION
	MOVEI B,(B)
	CAILE B,2
	PRINT EOL
	PRINT " "		;DON'T PRINT MSG IN COLUMN 0
	JRST [	POP P,B
		POP P,A
		RET]

;SUBROUTINE TO DO "GETER" JSYS AND PRESERVE AC'S 4-10.
;A MUST BE SET BY CALLER, RETURNS RESULT IN B.

$GETER:	PUSH P,D
	PUSH P,E
	PUSH P,F
	PUSH P,G
	PUSH P,G+1
	GETER
	POP P,G+1
	POP P,G
	POP P,F
	POP P,E
	POP P,D
	RET
;RLJFNS RJFNS1 RJFNS8

;RELEASE JFNS USED BY COMMAND BEING DECODED OR EXECUTED --
; USED AFTER ERRORS (%ERR) AND BY COMMAND EXECUTION ROUTINES.
;CLOSES AND RELEASES JFNS STACKED IN JBUF.
;EXCEPT DOESN'T GO BELOW CONTENTS OF ".JBUFP", WHICH IS NORMALLY 0
; BUT IS SET TO PRESERVE ASSIGNED JFN'S THRU ERRORS THAT RETURN
; TO A SUBCOMMAND INPUT LOOP.

RLJFNS:	PUSH P,A
	PUSH P,B
	PUSH P,C
	MOVE C,JBUFP

RJFNS1:	CAMLE C,[IOWD JBUFL,JBUF]	;STOP AT BOTTOM OF STACK,
	CAMN C,.JBUFP		;OR AT SAVED POINTER LEVEL
	JRST [	POP P,C
		POP P,B
		POP P,A
		RET]
;PROCESS ONE WORD OF JBUF
	HRRZ A,(C)		;GET A JFN TO CONSIDER
	CAIE A,100		;DON'T RELEASE PRIMARY
	CAIN A,101
	 JRST RJFNS8
	CAIL A,0		;DON'T RELEASE NEGATIVE,
	CAIL A,MAXJFN		;OR BIGGER IS GARBAGE
	 JRST RJFNS8
	CAME A,CRJFNI		;DON'T CLOSE SAVED INFILE,
	CAMN A,CRJFNO		;OR SAVED OUTFILE JFNS.
	JRST RJFNS8
	GTSTS
	TLNN B,200
	JRST RJFNS8		;INVALID, FORGET IT
	TLNN B,B0		;IS IT OPEN?
	JRST [	RLJFN		;NO, RELEASE IT
		 CALL JERR
		JRST RJFNS8]
	CLOSF			;YES, CLOSE AND RELEASE
	 CALL JERR
;DONE WITH THIS WORD

RJFNS8:	SETZM (C)		;ZERO JBUF WORD
	SUB C,[XWD 1,1]		;DECREMENT POINTER
	MOVEM C,JBUFP
	JRST RJFNS1
;%ETYPE ETYP2 ETYP2A

;%ETYPE (ETYPE MACRO, UETYPE UUO)
;HANDLER FOR UUO THAT TYPES MESSAGE, INTERPRETING % CODES.
;SPECIAL CODES ARE OF FORM %NL%
;	WHERE N IS AN OPTIONAL OCTAL NUMBER SPECIFYING AN AC
;	      L IS A LETTER:
;		D: TYPE CURRENT DATE
;		J: TYPE TSS JOB #
;		O: TYPE CONTENTS OF INDICATED AC IN OCTAL
;		SEE DISPATCH TABLE %LETS ON NEXT PAGE FOR FULL LIST.

%ETYPE:	PUSH P,Z
	PUSH P,A
	PUSH P,B
	PUSH P,C
	PUSH P,D
	HRR A,40
	HRLI A,<POINT 7,0,-1>B53	;FORM BYTE PTR FROM EFF ADDR
ETYP2:	ILDB B,A			;NEXT CHARACTER
ETYP2A:	JUMPE B,[POP P,D		;NULL TERMINATES TEXT
		POP P,C
		POP P,B
		POP P,A
		SUB P,[XWD 1,1]		;FORGET SAVED Z VALUE
		RET]
	CAIE B,"%"
	JRST [	CALL CCHRO		;NOT A %, OUTPUT IT
		JRST ETYP2]
;ETYP4 ETYP5 END%

;%ETYPE...
;"%" SEEN

	SETZB C,D		;C: IF NO NUMBER, USE 0
				;D: INIT NUMBER TO 0.
ETYP4:	ILDB B,A		;CHARACTER AFTER %
	CAIG B,"9"
	CAIGE B,"0"
	JRST ETYP5
	IMULI D,10
	ADDI D,-"0"(B)		;ADD NEW DIGIT TO NUMBER
	MOVE C,D		;COMPUTE LOCATION TO GET AC FROM...
	CAIG C,D		;...AC'S 5-9 ARE PRESERVED,
	ADDI C,-4(P)		;...CONTENTS OF 0-4 ARE IN PUSHDOWN.
	MOVE C,(C)		;FETCH CONTENTS OF AC INDICATED BY NUMBER SO FAR
	JRST ETYP4		;GO CHECK FOR ADDITIONAL DIGIT(S)
ETYP5:	PUSH P,A		;SAVE BYTE PTR DURING PROCESSING
	CAIL B,"A"
	CAILE B,"Z"		;HIGHEST LETTER IN TABLE
	CALL UN%		;NOT LETTER, UNRECOGNIZED % CODE
	CALL @%LETS-"A"(B)	;DISPATCH WITH A PUSHJ THROUGH LETTER
				;TABLE.  AT THIS TIME C CONTAINS 0 OR
				;C(INDICATED AC).

;DONE INTERPRETING A % CODE.  MUST FOLLOW DISPATCH PUSHJ!

END%:	POP P,A		;GET TEXT POINTER BACK
	ILDB B,A		;NEXT CHARACTER
	CAIE B,"%"		;PASS FOLLOWING %
	MOVE A,1(P)
	JRST ETYP2		;CONTINUE TYPING
;%LETS UN%

;%ETYPE...
;DISPATCH TABLE FOR LETTERS AFTER %

%LETS:	%A		;CURRENT TIME
	%B		;CPU TIME USED
	%C		;CONNECT TIME
	%D		;CURRENT DATE
	%E		;SAME TIME AS LAST %D
	%F		;"FORK N " IF >1 INFERIOR
	%G		;CONNECTED DIR NAME
	%H		;DEVICE NAME FOR DESIGNATOR IN INDICATED AC
	%I		;NUMBER OF LOGGED IN USERS
	%J		;TSS JOB #
	%K		;UPTIME
	%L		;"LINE N" OR "DETACHED"
	%M		;ACCT # OR STRING POINTER, AS FOR LOGIN
	%N		;NAME UNDER WHICH USER IS LOGGED IN
	%O		;CONTENTS OF SPECIFIED AC IN OCTAL
	%P		;CONTENTS OF RIGHT HALF OF SPECIFIED AC IN OCTAL
	%Q		;CONTENTS OF AC IN DECIMAL
	%R		;DIRECTORY NAME FOR DIR # IN AC
	%S		;FILE NAME FOR JFN IN AC
	%T		;CONTENTS OF AC AS PERCENTAGE OF UP TIME
	%U		;DECIMAL BIT NUMBERS, SEPARATED BY COMMAS
	%V		;CPU TIME WITH TENTHS OF SECONDS
	UN%
	%X		;TYPE ILLEG INST ERROR MSG
	%Y		;RETYPE COMMAND LINE, A LA ↑R
	%Z		;TYPE KEYWORDS IN TABLE AC POINTS TO

;UNRECOGNIZED %-CODE

UN%:	SUB P,[XWD 1,1]	;FORGET RETURN
	POP P,A		;RECOVER TEXT POINTER
	TYPE <%>	;DIGIT, IF ANY, IS LOST.
	JRST ETYP2A	;CONTINUE TYPING, STARTING WITH CHAR AFTER %.
;%A A1 A2 %B %B1 %C %D %E

;%ETYPE...
;ROUTINES FOR LETTERS AFTER %.
;THESE ROUTINES RECEIVE IN C: CONTENTS OF SPECIFIED AC, OR 0 IF NONE.
;THEY MAY CLOBBER AC'S A, B, C, AND D ONLY.

;CURRENT TIME

%A:	GTAD			;GET CURRENT DATE & TIME
A1:	HRLZI C,B0+B10+B17	;NO DATE, NO SECONDS. 24-HR TIME.
A2:	MOVE B,A
	MOVE A,COJFN
	CAMN B,[-1]		;DOES SYSTEM HAVE DATE & TIME?
	HRLZI B,1		;CHANGE TO CALL SCREWUP ←←←←←←←←
	ODTIM
	RET

;CPU TIME USED. ALSO SEE %V.

%B:	HRROI A,-5		;SAY WHOLE JOB
	RUNTM
%B1:	IDIV A,B		;CONVERT TO SECS
	JRST TOUT		;TYPE AS H:MM:SS

;CONSOLE TIME USED

%C:	HRROI A,-5
	RUNTM
	MOVE A,C
	JRST %B1

;DATE

%D:	SKIPN A,C		;USE GIVEN QUANTITY IF ANY
	GTAD			;GET CURRENT DATE & TIME FROM SYSTEM
	MOVEM A,%EDAYT		;SAVE FOR %E
	HRLZI C,B9+B17		;DATE ONLY, STANDARD CONCISE FORMAT
	JRST A2			;GO PRINT DATE

;SAME TIME AS LAST %D, TO AVOID INCONSISTENCIES AT MIDNITE.

%E:	MOVE A,%EDAYT
	JRST A1			;SEE %A
;%F %H

;ETYPE'S % ROUTINES ...

;TYPE "FORK N " ONLY IF THIS EXEC HAS >1 INFERIORS.
; GET FORK HANDLE FROM INDICATED AC, OR IF NONE, CELL "LRFORK".
;FIRST READ FORK STRUCTURE TO FIND OUT HOW MANY FORKS THERE ARE.

%F:	RET	;CASTRATED TEMPORARILY BECAUSE GFRKS NOT DONE AND
		;THERE'S NO WAY OF GETTING A HANDLE ON FORK MORE THAN
		;ONE LEVEL DOWN YET AND THERE'S NO WAY THE EXEC CAN
		;GET MORE THAN ONE IMMEDIATE INFERIOR.  HENCE LRFORK
		;IS ALWAYS THE EXEC'S FIRST AND ONLY IMMED INFERIOR.
		; 5/22/70. ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
;	MOVEI A,400000		;SAY START AT SELF
;	MOVEI B,CSBUF		;USE STRING BUFFER
;	GFRKS			;GET FORK STRUCTURE
;	HRRZ A,(B)		;PTR TO INFERIOR
;	MOVE A,(A)		;XWD ITS PARELLEL, ITS INFERIOR
;	JUMPE A,[RET]		;NEITHER EXISTS, PRINT NOTHING.
;	TYPE <FORK >;
;	SKIPG B,C		;USE GIVEN HANDLE IF SUPPLIED
;	MOVE B,LRFORK		;ELSE HANDLE OF LAST RUN FORK
;	TRZ B,B0		;PRINT ## NOT 4000##.
;	CALL TOCT		;OCTAL OUTPUT FROM B
;	PRINT " "
;	RET

;DEVICE NAME FOR DESIGNATOR IN INDCATED AC.

%H:	MOVE A,C
	DVCHR		;TRANSLATE JFN (IF GIVEN) TO DEVICE DESIGNATOR
	MOVE B,A
	MOVE A,COJFN
	DEVST		;DEVICE TO STRING
	 CALL JERR
	RET
;%I %I1 %I3 %K

;NUMBER OF USERS ON SYSTEM.
;COUNTS NUMBER OF POSITIVE ENTRIES IN SYSTEM TABLE 1.

%I:	SETZ B,			;COUNTER
	SETO D,			;TABLE WORD -1 IS LENGTH
	GTB 1
	HRLZ D,A		;SET UP LOOP COUNTER/TABLE INDEX
;	GTB 1
;	JUMPL A,%I1		;NO JOB 0
;	GTB 0
;	JUMPL A,%I3		;IGNORE DETACHED JOB 0
%I1:	GTB 1			;TABLE 1 IS POSITIVE IF JOB EXISTS
	JUMPL A,%I3
	GTB 3			;TABLE 3 ENTRY RH IS 0 IF NOT LOGGED IN
	TRNE A,-1		;OMIT UNLOGGEDIN USERS FROM COUNT
	AOS B
%I3:	AOBJN D,%I1
	JUMPE B,[UTYPE [ASCIZ /No jobs/]
		RET]
	CAIN B,1
	 JRST [	UTYPE [ASCIZ /One job/]
		RET]
	MOVE A,COJFN
	MOVEI C,↑D10
	NOUT			;PRINT NUMBER
	 CALL JERRC		;ERROR NUMBER IN C
	CAIL B,↑D10
	PRINT "!"
	CAIL B,↑D15
	PRINT "!"
	CAIL B,↑D20
	PRINT "!"
	TYPE < jobs>
	RET

;UPTIME

%K:	TIME			;TIME SINCE SYSTEM RESTARTED
	IDIV A,B		;CONVERT TO SECONDS
	CALL TOUT		;PRINT AS HH:MM:SS
	CAIL A,↑D50*↑D3600
	PRINT "!"
	CAML A,[↑D100*↑D3600]
	PRINT "!"
	CAML A,[↑D150*↑D3600]
	PRINT "!"
	RET
;%L %M %G %N

;ETYPE'S % ROUTINES ...

;"TTY N" OR "DETACHED"

%L:	GJINF
	JUMPL D,[UTYPE [ASCIZ /Detached/]
		RET]
	TYPE <TTY>;
	MOVE A,COJFN
	MOVE B,D
	JRST TOCT		;TYPE OCTAL FROM B

;ACCOUNT
;TAKES 5B2+NUMBER, OR STRING POINTER, IN INDICATED AC, AS LOGIN.

%M:	MOVE A,COJFN
	LDB B,[POINT 3,C,2]
	CAIE B,5
	JRST [	MOVE B,C
		SETZ C,
		SOUT
		RET]
	MOVE B,C
	TLZ B,700000
	MOVEI C,↑D10
	NOUT
	 CALL JERRC
	RET

;NAME OF CONNECTED DIRECTORY. MUST PRECEDE %N.

%G:	GJINF
	JRST .+3

;USER (DIRECTORY) NAME LOGGED IN UNDER.

%N:	GJINF
	MOVE B,A		;LOGIN DIRECTORY NO
	MOVE A,COJFN
	DIRST
	 PRINT "?"		;NASSIGNED DIR #, NO SYST ERR # IN A.
	RET
;%O %P %J %Q %Q2 %Q1 FLOAT

;ETYPE'S % ROUTINES...

;OCTAL NUMBER IN SPECIFIED AC.

%O:	MOVE B,C
	JRST TOCT		;TYPE OCTAL FROM B

;18 BIT OCTAL NUMBER FROM RIGHT HALF OF SPECIFIED AC

%P:	HRRZ B,C
	JRST TOCT

;TSS JOB NUMBER. MUST PRECEDE %Q.

%J:	GJINF			;GETS JOB # IN C

;FLOATING PT OR DECIMAL NUMBER FROM AC.
;PRINT AS FLOATING IF NORMALIZED AND WITH EXPONENT 100<E<377

%Q:	MOVE B,C
	MOVM C,B
	TLNE C,700000		;EXPONENT .GE. 100?
	TLNN C,400		;NORMALIZED?
	JRST %Q1		;NO, PRINT DECIMAL
	CAMGE C,[1.0E5]		;CAN ACCOMMODATE FIXED POINT?
	 JRST %Q2		;YES, DON'T USE FLOUT
	MOVEI A,3		;MIN NUMBER OF COLUMNS FOR FIELD 1
	CAMGE C,[100.0]		;FIND RANGE OF NUMBER
	JRST .+3
	FDVRI C,(10.0)		;REDUCE NUMBER
	AOJA A,.-3		;COUNT ONE MORE PLACE FOR FIELD 1
	MOVE C,[1B4+1B6+2B29]	;POINT AND AT LEAST ONE DIG TO LEFT
	DPB A,[POINT 6,C,23]	;AND 2 DIG AFTER PT
	MOVE A,COJFN
	FLOUT
	CALL JERRC
	RET

;HERE TO DO OUR OWN FLOATING OUTPUT RATHER THAN CALLING FLOUT
%Q2:	FMPRI C,(100.0)		;WANT TWO DIGITS PAST DECIMAL POINT
	FADRI C,(0.5)		;ROUND
	MULI C,400		;CONVERT TO INTEGER
	ASH D,-243(C)
	SKIPL B			;CORRECT SIGN
	SKIPA C,D
	MOVN C,D
	IDIVI C,↑D100		;GET INTEGER PART
	PRINT " "		;ALWAYS ONE LEADING BLANK
	MOVE B,C		;PRINT INTEGER PART
	CALL %Q1
	PRINT "."
	MOVM B,D
	SKIPA C,[1B2+1B3+2B17+↑D10]
%Q1:	MOVEI C,↑D10
	MOVE A,COJFN
	NOUT
	 CALL JERRC
	RET

;FLOAT THE INTEGER IN A

FLOAT:	IDIVI A,400000		;BREAK NUMBER INTO TWO PARTS
	FSC A,254		;CONVERT HIGH PART
	FSC B,233		;CONVERT LOW PART
	FADR A,B		;COMBINE PARTS
	RET
;%R %S %T

;DIRECTORY NAME FOR NUMBER IN AC

%R:	MOVE A,COJFN
	MOVE B,C
	DIRST
	 PRINT "?"
	RET

;FILE NAME FOR JFN IN AC

%S:	MOVE A,COJFN
	MOVE B,C
	SETZ C,
	JFNS
	RET

;CONTENTS OF AC AS PERCENTAGE OF UP TIME

%T:	TIME		;GET UPTIME IN A
	MULI C,↑D200
	DIV C,A		;HOPE DIVISORS TO CONVERT TO SECS ARE SAME
	ADDI C,1	;ROUND
	LSH C,-1
	CALL %Q		;PRINT IN DECIMAL
	PRINT "%"
	RET
;%U %U1 %U2 %U3 %V

;ETYPE'S % ROUTINES...

;CONTENTS OF AC AS LIST OF DECIMAL NUMBERS FOR SET BITS,
; OR "NONE" IF AC 0.

%U:	JUMPE C,[UTYPE [ASCIZ /None/]
		RET]
	SETZ D,			;BIT NUMBER
	TLNE C,B0		;FIND FIRST SET BIT
	JRST %U2
	LSH C,1
	AOS D
	JRST .-4		;LOOP FOR SUCCESSIVE BITS

%U1:	TLNN C,B0
	JRST %U3
	PRINT ","		;COMMA (AND SPACE) BEFORE ALL BUT FIRST
	MOVE A,COJFN
	RFPOS
	MOVEI B,(B)
	CAIL B,↑D55
	PRINT EOL		;EOL IF TOO FAR RIGHT
	PRINT " "
%U2:	ETYPE <%4Q>		;BIT # IN DECIMAL
%U3:	AOS D
	LSH C,1
	JUMPN C,%U1
	RET

;CPU TIME USED, INCLUDING TENTHS OF SECONDS, FOR ↑T FOR DGB.

%V:	HRROI A,-5		;SAY WHOLE JOB
	RUNTM
	MOVE C,B		;TICKS PER SECOND
	IDIV A,B		;CONVERT TIME IN TICKS TO SECS
	CALL TOUT		;TYPE H:MM:SS
	IDIVI C,↑D10		;GET TICKS PER 1/10 SEC
	JUMPN D,[RET]		;NOT EVEN, DON'T PRINT TENTHS OF SECS
	IDIV B,C		;CONVERT REMAINDER OF TICKS TO TENTHS
	ETYPE <.%2Q>;		;TYPE TENTHS OF SECONDS
	RET
;%X %X1 %X3 %X9

;ETYPE'S % ROUTINES...

;TYPE VALUE OF ILLEGAL INSTRUCTION, " AT" PC, AND,
; IF ILLEG INSTRUCTION WAS A JSYS, A SYSTEM ERROR MESSAGE.
;FORK HANDLE IN LRFORK, PC IN AC.
;USED IN A MESSAGE IN TABLE "WHY" THAT IS USED BY "START", "RUNSTAT", ↑T

%X:	SETZB B,D		;SAY HAVEN'T GOT INSTRUCTION YET
	MOVEI A,-1(C)		;MASK PC AND SUBTRACT 1
%X1:	PUSH P,FORK
	SKIPGE EFORK		;USE EFORK IF THERE IS ONE, LRFORK IF NOT
	PUSH P,LRFORK		;MOVE-MOVEM WITHOUT USING AN AC
	SKIPL EFORK
	PUSH P,EFORK
	POP P,FORK		;SET "FORK" FOR MAPPF
	CALL MAPPF		;MAP PAGE OF FORK INTO BUFFER "PAGEN"
	POP P,FORK
	TLNE A,B5		;NO SUCH PAGE (SHOULDN'T OCCUR)
	TLNN A,B2
	JRST %X3		;READ PROTECTED, FORGET IT
	ANDI A,777		;MASK ADDRESS WITHIN PAGE
	JUMPN D,.+2		;JUMP IF TRACING AN XCT
	MOVE D,PAGEN(A)		;PICK UP INST 1ST TIME THROUGH
	HLRZ B,PAGEN(A)		;FETCH LH OF INST THAT FAILED
	TRZ B,740		;IGNORE AC FIELD 
	CAIN B,<XCT>B53		;TRACE SIMPLE XCT'S.
				;DON'T HANDLE INDEXING OR
				;INDIRECT ADDRESSING.
	JRST [	MOVEI A,@PAGEN(A)	;GET EFF ADDR
		JRST %X1]		;GO BACK AND GET ADDRESSED WORD
	ETYPE <%4O >		;TYPE INSTRUCTION
%X3:	ETYPE <at %3P>		;PC
	CAIE B,<JSYS>B53
	JRST %X9		;NOT A JSYS, DONE
	TYPE < - JSYS error:
  >;
	SKIPGE A,EFORK		;USE EPHEMERON IF IT EXISTS, ELSE LRFORK
	SKIPL A,LRFORK		;GET ERROR CODE NOW FOR ERSTR ERR RET
	CALL $GETER		;DO GETER JSYS, PRESERVING 4-10
	MOVE A,COJFN
	SETZ C,
	ERSTR			;PRINT SYSTEM ERR MSG FOR CODE IN B
	 JRST [	UETYPE [ASCIZ /Error message not found for error %2P/]
		JRST .+2]	;R1: BAD ERROR NUMBER
	JRST .+1		;R2: DESTINATION PROBLEM, FORGET IT.
%X9:	SETO A,
	JRST MAPPF		;UNMAP PAGE THEN RETURN
;%Y %Z %Z1 %Z2

;ETYPE'S % ROUTINES...

;RETYPE CURRENT COMMAND INPUT LINE

%Y:	PRINT EOL
	PRINT " "
	MOVE B,BFP
	IDPB C,B		;TERMINATE WITH NULL: ASSUME C 0.
	UTYPE CBUF
	RET

;LIST ALL KEYWORDS IN TABLE AC POINTS TO

%Z:	SKIPN A,(C)		;PICK UP TABLE COUNT
	RET			;NULL TABLE
%Z1:	AOS C			;STEP TABLE POINTER
	HLRZ B,(C)		;LH OF TABLE WORD POINTS TO...
	MOVE B,(B)		;VALUE WORD
	TLNE B,INVIS
	JRST %Z2		;DON'T PRINT IF "INVISIBLE"
	MOVE B,(C)		;RH OF TABLE WORD POINTS TO TEXT
	PRINT " "
	UTYPE (B)		;TYPE TEXT OF TABLE ENTRY
	PRINT EOL
%Z2:	SOJG A,%Z1		;ENDTEST AND LOOP
	RET
;TOUT

;SUBROUTINE TO TYPE NUMBER OF SECONDS IN A IN THE FORM H:MM:SS.

TOUT:	PUSH P,A
	PUSH P,B
	PUSH P,C
	MOVE B,A
	MOVE A,COJFN
	IDIVI B,↑D3600
	PUSH P,C
	MOVEI C,↑D10
	NOUT			;HOURS
	 CALL JERRC
	PRINT ":"
	POP P,B
	IDIVI B,↑D60
	PUSH P,C
	MOVE C,[XWD B2+B3+2,↑D10]	;2 COLS, LEADING 0'S.
	NOUT			;MINUTES
	 CALL JERRC
	PRINT ":"
	POP P,B
	NOUT			;SECONDS
	 CALL JERRC
	JRST [	POP P,C
		POP P,B
		POP P,A
		RET]
;UNMAP

; UNMAP ALL USELESS PRIVATE PAGES
;  CALLED BY ERROR (↑C), AND "RESET"

;PAGE 747 IS "RSYSTAT" PAGE FOR NETLOAD COMMAND
;PAGES 750 TO 767 INCLUDE BUF1, BUF2, DIRECTORY

UNMAP:	SETO A,
	MOVE B,[400000,,747]
	HRLZI C,1
	MOVEI D,21
	PMAP
	AOS B
	SOJG D,.-2
	RET
;$SYSGT SYSGT1 SYSGT2 SYSGT3 SYSGT4

;$SYSGT  SIMULATES A SYSGT JSYS BY TRYING A HASH LOOKUP IN A LOCAL TABLE
;  FIRST, AND THEN THE SYSTEM IF IT IS NOT IN THE TABLE.  NOTE
;  THE SYSTEM DOES A (SLOW) LINEAR SEARCH PLUS CONTEXT SWITCHES.

;  AC'S AT ENTRY AND EXIT ARE EXACTLY THOSE OF SYSGT

$SYSGT:	PUSH P,C		;SAVE FOR CALLER
	PUSH P,A		;SIXBIT OF TABLE NAME
	MOVEI C,SGTBLN		;COUNT THIS MANY PROBES (TABLE FULLNESS)
	TSC A,A
	LSH A,-1		;FAST HASH IS BETTER THAN BURNED CYCLES
	IDIVI A,SGTBLN		;ON A BIG TABLE, AT LEAST.

SYSGT1:	SKIPN A,SGTNAM(B)	;GET NAME FROM HASH TABLE
	 JRST SYSGT2		;HIT A 0 -- TRY THE SYSTEM
	CAMN A,0(P)		;IS THIS THE ONE WE ARE LOOKING FOR?
	 JRST SYSGT3		;YES, USE IT.
	SOSGE B			;DO LINEAR SEARCH BACKWARDS
	MOVEI B,SGTBLN-1	;RING THE POINTER
	SOJG C,SYSGT1		;BEEN THRU THE WHOLE TABLE?
	CALL SCREWUP		;MAKE SGTBLN BIGGER!!!!

SYSGT2:	PUSH P,B		;SAVE THE INDEX
	MOVE A,-1(P)		;GET BACK THE NAME
	SYSGT			;TRY THE SYSTEM
	JUMPE B,SYSGT4		;OH WELL
	EXCH B,0(P)		;GET BACK INDEX
	POP P,SGTAC2(B)		;INSERT ENTRY INTO HASH TABLE
	MOVEM A,SGTAC1(B)
	POP P,SGTNAM(B)
	MOVE B,SGTAC2(B)
	POP P,C
	RET

SYSGT3:	MOVE A,SGTAC1(B)
	MOVE B,SGTAC2(B)
	SUB P,[1,,1]
	POP P,C
	RET

SYSGT4:	SUB P,[2,,2]
	POP P,C
	RET
;FPIN

;FLOATING POINT NUMBER INPUT

;PRE-READS STRING IN ORDER TO DO EDITTING AND NOISE

FPIN:	CALL CSTR		;COLLECT A STRING
	CAIN TRM,"."
	 JRST MORE		;GET MORE -- BACK INTO CSTR
	AOS CNT			;MAKE BUFFF INCLUDE THE TERMINATOR
	CALL BUFFF		;BUFFER UP, READY FOR A JSYS CALL
	SOS CNT
	FLIN			;INPUT FLOATING NUMBER FROM BUFFER
	 CALL [	CAIN A,FLINX4	;-.Q  AND OTHER FUNNY FORMATS
		 JRST [	LDB B,A	;GET THE LAST CHARACTER READ
			JUMPE B,[SUB P,[1,,1]	;READ IT ALL
				JRST MORE]	;GO BACK INTO CSTR
			JRST CERR]	;DIDN'T USE ALL CHARACTERS
		CAIN C,FLINX1	;BAD FORMAT
		 JRST CERR
		CAIE C,FLINX2	;UNDER FLOW
		CAIN C,FLINX3	;OVER FLOW
		 JRST CERR
		JRST JERRC]	;ANYTHING ELSE BOMBS THE EXEC
	IBP A			;STEP OVER THE NULL
	CAME A,CSBUFP		;FLIN USED THE ENTIRE STRING?
	 JRST CERR		;NO
	MOVE A,B		;HERE IS THE ANSWER
	RET			;CALLER IS TO DO TERM CHK AND CONF

	END EXEC